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
相关产品推荐
相关产品推荐

