Python DataFrame新增value_%列 实现Band分组批量计算
问题:为长格式DataFrame批量添加占比列
需求
已将宽格式数据转换为长格式DataFrame,需要为所有Band类型批量新增value_%列,计算逻辑为:value_% = (当前行value值 / 对应Date的所有value总和) * 100
当前数据样例
Date Band value 03:Q1 <620 72.12 03:Q2 <620 71.41 03:Q3 <620 78.15 03:Q4 <620 90.06
期望结果样例
Date Band value value_% 03:Q1 <620 72.12 7.34 03:Q2 <620 71.41 7.04 03:Q3 <620 78.15 7.35 03:Q4 <620 90.06 8.76
已执行的长格式转换代码
df = pd.read_csv('https://raw.githubusercontent.com/GeorgeRobbin/GeorgeRobbin.github.io/main/Credit_Score.csv') df = pd.melt(df, id_vars=["Date"], var_name=("Band")) # 注:原代码中的df3应为笔误,修正为df
解决方案
使用groupby结合transform方法,按Date分组计算总和,再逐行计算占比:
# 计算每个日期对应的总value,生成与原DataFrame同长度的Series total_by_date = df.groupby('Date')['value'].transform('sum') # 新增value_%列并保留两位小数 df['value_%'] = (df['value'] / total_by_date * 100).round(2)
关键说明
groupby('Date')['value'].transform('sum')会对每个日期的所有value求和,然后将结果广播到该日期的每一行,保证每行都能匹配到对应日期的总和round(2)用于将占比结果保留两位小数,与示例格式一致
内容的提问来源于stack exchange,提问作者user20901436
相关产品推荐
相关产品推荐

