2

我有一个非常大的 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

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

我将非常感谢您的帮助

安迪

4

1 回答 1

3

这对我来说似乎有点奇怪,但是 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

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

>>> 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
于 2013-05-28T16:35:20.923 回答