【问题标题】:Pandas: Efficient way to do loops with groupby objectsPandas:使用 groupby 对象进行循环的有效方法
【发布时间】:2013-05-23 16:43:30
【问题描述】:

我有一个非常大的 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 中的单独列。

非常感谢您的帮助

安迪

【问题讨论】:

    标签: python group-by pandas


    【解决方案1】:

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

    【讨论】:

    • 您好帝斯曼,非常感谢您的帮助。对困惑感到抱歉。计算方式只是一个例子。实际上,行中有我需要进行计算的对象。对于这种特殊情况,您有什么建议?
    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2021-01-13
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多