【问题标题】:Apply groupby on a DataFrame to display cumulative stats在 DataFrame 上应用 groupby 以显示累积统计信息
【发布时间】:2025-11-25 03:30:01
【问题描述】:

假设我有一个如下所示的 DataFrame:

Bank Name     House     This Wk
Barc          Germany   100
Barc          UK        300
Barc          UK        500
JPM           Japan     200
JPM           NYC       100
BOA           LA        900
BOA           LA        50
BOA           LA        50
DB            Italy     45

我想按银行名称分组,同时输出最大的房屋价值以及总价值......

例如,使用上面的示例将导致:

Bank Name     Total     House     This Wk
Barc          900       UK        500
JPM           300       Japan     200
BOA           1000      LA        900
DB            45        Italy     45

本质上,它是按银行名称对Total 进行分组,但同时输出最大的贡献者House,贡献的金额是This Wk

我该怎么做呢?

【问题讨论】:

  • DataFrame是什么格式的?
  • @ands 字面上与上面的类似.. 你是什么意思什么格式?
  • 它是不是像文本文档中的字符串?
  • 不,它来自 csv - Bank Name 和 House 是字符串,其他是浮点数

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:
In [121]: df.groupby('Bank Name', group_keys=False) \
     ...:   .apply(lambda x: x.nlargest(1, 'This Wk').assign(Total=x['This Wk'].sum())) \
     ...:   [['Bank Name','Total','House','This Wk']]
     ...:
Out[121]:
  Bank Name  Total  House  This Wk
5       BOA   1000     LA      900
2      Barc    900     UK      500
8        DB     45  Italy       45
3       JPM    300  Japan      200

【讨论】:

  • 有没有机会按照我展示的方式格式化它..?如列中所示:Bank Name, Total, House, This Wk?
  • 我可以将结果设置为等于不同的数据帧吗?
  • 注意列名的顺序和它们各自的值
  • @sgerbhctim,我已经更新了我的帖子 - 这是你需要的吗?
  • 哟,进展如何。有什么想法吗? *.com/questions/45856926/…
【解决方案2】:

您可以考虑df.groupbydfGroupBy.agg 函数列表:

In [732]: out = df.groupby('Bank Name')['This Wk'].agg(['sum', 'idxmax', 'max'])\
               .rename(columns={'sum' : 'Total', 'idxmax' : 'House', 'max' : 'This Wk'})\
               .reset_index()


In [734]: out['House'] = df.loc[out['House'], 'House'].values; out
Out[734]: 
  Bank Name  Total  House  This Wk
0       BOA   1000     LA      900
1      Barc    900     UK      500
2        DB     45  Italy       45
3       JPM    300  Japan      200

【讨论】:

  • 我如何保持我上面显示的格式,这意味着列是Bank Name, Total, House, This Wk
  • 不只是重命名,如何更改列的顺序?
  • 哦,这很简单。只需更改 agg 函数的顺序即可。
  • @sgerbhctim 也已通过订单修复。
  • @cᴏʟᴅsᴘᴇᴇᴅ 打印,你可以试试import tabulate from tabulate print(tabulate.tabulate(df, df.columns, tablefmt="orgtbl"))
【解决方案3】:

使用apply 的另一种方式是

In [17]: (df.groupby('Bank Name', sort=False)
            .apply(lambda x: pd.Series(
                             [x['This Wk'].sum(), 
                              x.loc[x['This Wk'].idxmax(), 'House'], 
                              x['This Wk'].max()], 
                   index=['Total', 'House', 'This Wk']))
            .reset_index())
Out[17]:
  Bank Name  Total  House  This Wk
0      Barc    900     UK      500
1       JPM    300  Japan      200
2       BOA   1000     LA      900
3        DB     45  Italy       45

【讨论】:

    最近更新 更多