如何为Type 0数据生成mon_pct列:基于Type1月度总量计算占比
实现方法
假设你使用Pandas处理这份数据,可按以下步骤完成需求:
提取月份标识
从Day列的YYYYMMDD格式中提取月份信息,可通过截取字符串前6位实现:import pandas as pd # 假设数据存储在df中 df['Month'] = df['Day'].astype(str).str[:6] # 生成如'202301'的月份标记计算各月Type1的Volume总和
按月份分组,筛选Type=1的数据并求和:type1_month_sum = df[df['Type'] == 1].groupby('Month')['Volume'].sum().reset_index() type1_month_sum.rename(columns={'Volume': 'Type1_Month_Total'}, inplace=True)合并数据并计算mon_pct
将月度总和合并回原数据,仅为Type=0的行计算百分比:df = df.merge(type1_month_sum, on='Month', how='left') df['mon_pct'] = df.apply( lambda row: (row['Volume'] / row['Type1_Month_Total']) * 100 if row['Type'] == 0 else None, axis=1 ) # 无需保留Month列时可删除 df.drop('Month', axis=1, inplace=True)
更高效的简化写法
用transform方法跳过合并步骤,直接匹配对应月份的Type1总和:
df['Month'] = df['Day'].astype(str).str[:6] # 为每行匹配对应月份的Type1总和 df['Type1_Month_Total'] = df.groupby('Month')['Volume'].transform( lambda x: x[df.loc[x.index, 'Type'] == 1].sum() ) # 仅Type=0的行计算百分比,其余留空 df['mon_pct'] = df.where(df['Type'] == 0, None)['Volume'] / df['Type1_Month_Total'] * 100 # 清理临时列 df.drop(['Month', 'Type1_Month_Total'], axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

