【问题标题】:How to do a pandas groupby operation on one column but keep the other in the resulting dataframe如何对一列执行 pandas groupby 操作,但将另一列保留在结果数据框中
【发布时间】:2017-03-16 18:37:30
【问题描述】:

我的问题是关于 pandas 的 groupby 操作。我有以下数据框:

In [4]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]})

In [5]: df
Out[5]: 
   A   B     C
0  0  PO   Est
1  1  PO   Est
2  2  PA  West
3  3  PA  West

这就是我想做的:我想按 B 列分组并对 A 列求和。但最后,我希望 C 列仍然在 DataFrame 中。如果我这样做:

In [8]: df.groupby(by="B").aggregate(pd.np.sum)
Out[8]: 
    A
B    
PA  5
PO  1

它完成了这项工作,但缺少 C 列。我也可以这样做:

In [9]: df.groupby(by=["B", "C"]).aggregate(pd.np.sum)
Out[9]: 
         A
B  C      
PA West  5
PO Est   1

In [11]: df.groupby(by=["B", "C"], as_index=False).aggregate(pd.np.sum)
Out[11]: 
    B     C  A
0  PA  West  5
1  PO   Est  1

但在这两种情况下,它都按 B AND C 而不仅仅是 B 分组并保留 C 值。我想做的事无关紧要还是有办法?

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    尝试将DataFrameGroupBy.agg() 方法与dict of {column -> function} 一起使用:

    In [6]: df.groupby('B').agg({'A':'sum', 'C':'first'})
    Out[6]:
           C  A
    B
    PA  West  5
    PO   Est  1
    

    来自文档:

    用于聚合组的函数。如果是一个函数,必须要么 在传递 DataFrame 或传递给 DataFrame.apply 时工作。如果 传入一个dict,key必须是DataFrame列名。

    或类似的东西取决于你的目标:

    In [8]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est1", "Est2", "West1", "West2"]})
    
    In [9]: df.groupby('B').agg({'A':'sum', 'C':'first'})
    Out[9]:
            C  A
    B
    PA  West1  5
    PO   Est1  1
    
    In [10]: df['sum_A'] = df.groupby('B')['A'].transform('sum')
    
    In [11]: df
    Out[11]:
       A   B      C  sum_A
    0  0  PO   Est1      1
    1  1  PO   Est2      1
    2  2  PA  West1      5
    3  3  PA  West2      5
    

    【讨论】:

    • 如果 C 值在所有被分组的值上都相同,则此方法有效。否则,merge 就可以完成这项工作。
    • @Khris,谢谢你的提示!我添加了一个使用.transform() 方法的替代解决方案
    • 太棒了!!非常感谢。
    • 我不熟悉,但也许这个问题可以在 python/pandas wiki 或 stackoverflow 文档中结束?
    • @MaxU:感谢您提醒我transform 函数,到目前为止,我忽略了这一点并解决了繁琐的合并问题。
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2021-06-07
    • 2012-08-25
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多