【发布时间】:2014-12-14 20:57:25
【问题描述】:
我经常使用 pandas 的 agg() 函数对 data.frame 的每一列运行汇总统计信息。例如,以下是生成均值和标准差的方法:
df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'],
'B': [10, 12, 10, 25, 10, 12],
'C': [100, 102, 100, 250, 100, 102]})
>>> df
[output]
A B C
0 group1 10 100
1 group1 12 102
2 group2 10 100
3 group2 25 250
4 group3 10 100
5 group3 12 102
在这两种情况下,将各个行发送到 agg 函数的顺序并不重要。但请考虑以下示例:
df.groupby('A').agg([np.mean, lambda x: x.iloc[1] ])
[output]
mean <lambda> mean <lambda>
A
group1 11.0 12 101 102
group2 17.5 25 175 250
group3 11.0 12 101 102
在这种情况下,lambda 按预期运行,输出每组中的第二行。但是,我无法在 pandas 文档中找到任何暗示这在所有情况下都是正确的。我想将agg() 与加权平均函数一起使用,因此我想确保进入函数的行与它们在原始数据框中出现的顺序相同。
有谁知道,最好是通过文档或熊猫源代码中的某个地方,是否可以保证是这种情况?
【问题讨论】:
-
是的,我看不到文档中保留订单的任何保证,因此依赖它似乎有点不明智。如果您的
B列反映了排序,那么您可以在 lambda 中按B对每个组进行排序以确保。 -
不幸的是,我想保持行按未包含在聚合中的列排序。数据框在
agg()调用之前排序,因此只有将其重新排序为groupby()的一部分时才会出现问题。