You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组合并行:按日期与类别聚合生成占比详情列的实现

如何用Pythonic方式聚合DataFrame生成指定格式的输出?

我有一个大型的Pandas DataFrame,结构如下:

+----------------------------------------------------------+
| Date       Category Location ImpactRate |
+----------------------------------------------------------+
| 2018-04-22 Outage   MT       0.05194    |
| 2018-04-22 Outage   ND       0.02552    |
| 2018-04-22 Outage   SD       0.09962    |
| 2018-04-24 Transport TX       0.03111    |
+----------------------------------------------------------+

我期望生成如下格式的输出:

+-----------------------------------------------------------------------------------+
| Date       Category ImpactRate Break Down |
+-----------------------------------------------------------------------------------+
| 2018-04-22 Outage   0.17708    MT (29.3%) SD (14.4%) ND (56.3%) |
| 2018-04-24 Transport 0.03111    TX (100.0%) |
+-----------------------------------------------------------------------------------+

简单来说,就是要按Date和Category分组:

  • 计算每组ImpactRate的总和
  • 把组内每个Location和对应的占比(该Location的ImpactRate/组总和×100,保留1位小数)格式化成Location (XX.X%)的形式,再拼接成字符串

我的两次尝试均未成功

第一次尝试 - GroupBy

我想用GroupBy来拆分数据,但结果生成的DataFrame有大量NaN值,而且新增的列还需要额外做格式化处理,完全没达到预期效果:

grouped_df = df.groupby('Date')['ImpactRate'].apply(list).apply(pd.Series).rename(columns=df['Location'])

第二次尝试 - 使用itertuples()循环

我尝试用itertuples()迭代每行数据,想手动处理分组逻辑,但最后只得到了一个包含所有ImpactRate的大列表,相当于绕回了原点:

r = []
for item in df.itertuples():
    temp_x = df.loc[((df['Category'] == item[2]) & (df['Date'] == item[1]))
    for i in range(temp_x.shape[0]):
        r.append(temp_x['ImpactRate'].iloc[i])

现在我有点摸不着头绪,猜测可能需要在迭代中创建嵌套列表来处理分组,但始终找不到正确的实现方式。请问如何用最Pythonic的方式实现这个需求? 希望能给出详细的解释,方便我理解和学习!

内容的提问来源于stack exchange,提问作者NRH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:32