gpt4 book ai didi

python - Pandas:使用 groupby 对象进行循环的有效方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:31 24 4
gpt4 key购买 nike

我有一个非常大的 DataFrame,我想做一些大量的分组比较。作为示例,我们采用以下示例:

df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': ['me', 'you', 'me'] * 2,
'C': [5, 2, 3, 4, 6, 9]})

现在我想按 A 列分组并有效地循环遍历这些组并按以下方式进行逐行比较:

gb = df.groupby(['A'])

for k, gp in gb:
for i in arange(len(gp['C'])):
sum = 0
for j in arange(len(gp['C'])):
if (i != j):
sum = sum + gp['C'].irow(j)
print gp['C'].irow(i) - sum

是否有可能更有效地执行此操作并将其结果分配给 Dataframe 中的单独列。

非常感谢你的帮助

安迪

最佳答案

这对我来说似乎有点奇怪,但是 IIUC,你的输出是由

df["weird_C"] = 2*df["C"] - df.groupby("A")["C"].transform(np.sum)

例如:

>>> df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': ['me', 'you', 'me'] * 2,
'C': [5, 2, 3, 4, 6, 9]})
>>> df
A B C
0 foo me 5
1 bar you 2
2 foo me 3
3 bar me 4
4 foo you 6
5 bar me 9
>>> df["weird_C"] = 2*df["C"] - df.groupby("A")["C"].transform(np.sum)
>>> df
A B C weird_C
0 foo me 5 -4
1 bar you 2 -11
2 foo me 3 -8
3 bar me 4 -7
4 foo you 6 -2
5 bar me 9 3

基本上,pandas 在快速矢量化 C 中一次可以做的越多,事情就会越好。在这种情况下,我们可以一次求和,而不是遍历组成员然后减去我们添加的额外位:

>>> df.groupby("A")["C"].sum()
A
bar 15
foo 14
Name: C, dtype: int64

更好的是,我们可以使用transform,这样广播就会给我们一组总和的系列:

>>> df.groupby("A")["C"].transform(np.sum)
0 14
1 15
2 14
3 15
4 14
5 15
Name: C, dtype: int64

然后因为我们有组的总和,我们真的想要每个值与其他值之间的差异,我们可以将“x - rest”视为“x + x - x - rest”或“x + x -(总计)”,或“2*x - 总计”:

>>> 2*df["C"] - df.groupby("A")["C"].transform(np.sum)
0 -4
1 -11
2 -8
3 -7
4 -2
5 3
Name: C, dtype: int64

关于python - Pandas:使用 groupby 对象进行循环的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com