【问题标题】:pandas, keep groupby groups after applypandas,申请后保留 groupby 组
【发布时间】:2018-06-25 13:52:38
【问题描述】:

我想在我的数据帧上使用groupby,然后用apply链接每个组上的一系列函数调用。

作为第一个原型,我设置了一个示例,将数据框的条目从字符串转换为数字。数据框如下所示:

frame = pd.DataFrame({
    "number": ["1", "2", "3", "4", "5", "6", "7", "8"], 
    "type": ["a",] * 4 + ["b",] * 4})

生成的数据框是:

此数据框中的数字是字符串。因此,在我可以使用任何数学运算之前,必须将它们转换为数字类型。这就是我想做的应用:

frame.groupby("type")["number"].apply(pd.to_numeric)

但结果是包含所有项目的单个系列:

0    1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
Name: number, dtype: int64

我已经为此阅读了docs。显然你可以使用transformapply。 在样本中,似乎保留了分组结构。

也许它与pd.to_numeric 有关?所以我尝试了:

frame.groupby("type")["number"].apply(lambda x: int(x))

这会导致 TypeError:

TypeError:无法将系列转换为

显然,apply 将整个组作为参数。 每组的结果似乎都连接到一个数据帧中。

是否可以以保持分组结构的方式使用 apply ? 我想要一个调用,将函数应用于组内的每一列并保留组。然后我可以链接调用。

我发现的一个相关问题是: pandas: sample groups after groupby

但答案建议在分组之前应用该功能。这不适用于链接功能。而对于像mean() 这样的东西则完全没有。

【问题讨论】:

  • 你为什么不做df['number'] = df['number'].astype(int)first,然后他们做你的groupby?
  • 设置只是一个例子。这个技巧与groupby后采样的答案基本相同:首先应用必要的功能。对于这个特定问题,这绝对是一个很好的答案,但我想知道如何为更复杂的情况进行链接
  • 我不明白你的标题。保持组结构是什么意思? """是否可以以保持分组结构的方式使用 apply ?我想要一个调用,将函数应用于组内的每一列并保留组。然后我可以链接调用。""" grouped structure 是什么?您是想说要保持行数不变吗?

标签: python pandas pandas-groupby pandas-apply


【解决方案1】:

您在这里收到的消息和行为是因为您实际上是在调用: pd.core.groupby.SeriesGroupBy.apply(self, func, *args, **kwargs) 而不是 Series.applyDataFrame.apply

但结果是包含所有项目的单个系列:

这似乎与here 描述的案例#3 相符。

显然,apply 将整个组作为参数。

是的

每组的结果似乎都连接到一个数据帧中。

取决于上面链接的案例

是否可以以保持分组结构的方式使用 apply ?我想要一个调用,将函数应用于组内的每一列并保留组。然后我可以链接调用。

您必须提供更多关于您想要实现的目标的详细信息,但 aggregatetransform 似乎确实是不错的候选人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 2021-05-13
    • 2020-06-05
    • 1970-01-01
    • 2021-07-08
    • 2018-07-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多