【问题标题】:How to aggregate a column by a value on another column?如何通过另一列上的值聚合一列?
【发布时间】:2018-06-02 00:33:59
【问题描述】:

假设我有以下 df。

df = pd.DataFrame({
    'A':['x','y','x','y'],
    'B':['a','b','a','b'],
    'C':[1,10,100,1000],
    'D':['w','v','v','w']
})

    A   B   C       D
0   x   a   1       w
1   y   b   10      v
2   x   a   100     v
3   y   b   1000    w

我想按 A 和 B 列分组,对 C 列求和,并保留 D 中的值,这是 C 的最大组值的同一行。像这样:

A   B   C      D
x   a   101    v
y   b   1010   w

到目前为止,我有这个:

df.groupby(['A','B']).agg({'C':sum})

A   B   C
x   a   101
y   b   1010

我必须用什么函数来聚合 D 列?

【问题讨论】:

    标签: pandas pandas-groupby


    【解决方案1】:

    您可以将DataFrameGroupBy.idxmax 用于Cloc 的最大值索引:

    #unique index
    df.reset_index(drop=True, inplace=True)
    df1 = df.groupby(['A','B'])['C'].agg(['sum', 'idxmax'])
    df1['idxmax'] = df.loc[df1['idxmax'], 'D'].values
    df1 = df1.rename(columns={'idxmax':'D','sum':'C'}).reset_index()
    

    map类似的解决方案:

    df1 = df.groupby(['A','B'])['C'].agg(['sum', 'idxmax']).reset_index()
    df1['idxmax'] = df1['idxmax'].map(df['D'])
    df1 = df1.rename(columns={'idxmax':'D','sum':'C'})
    

    print (df1)
       A  B     C  D
    0  x  a   101  v
    1  y  b  1010  w
    

    【讨论】:

    • 这已经不止一次地救了我。只是想补充一点,在这之前可能需要df.reset_index(inplace=True),因为无论出于何种原因,不止一行可能具有相同的索引标签。
    【解决方案2】:

    set_index在你分组之前

    df.set_index('D').groupby(['A','B']).C.agg(['sum','idxmax']).\
        reset_index().rename(columns={'idxmax':'D','sum':'C'})
    Out[407]: 
       A  B     C  D
    0  x  a   101  v
    1  y  b  1010  w
    

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多