如何在Pandas中用2020与2021数据均值替换2020年行的数值?
问题
我有一个包含group、date和value列的DataFrame,日期为月度级别。由于2020年数据受新冠疫情影响,我想用2020年和2021年对应数据的均值来填充2020年的数值,请问如何实现?
输入示例:
import pandas as pd input_df = pd.DataFrame({ 'group': ['A', 'A', 'A','A', 'B','B','B','B','A','B'], 'date': ['2020-01-31', '2021-01-31', '2020-03-31','2021-03-31', '2020-01-31', '2021-01-31', '2020-03-31','2021-03-31','2022-01-31', '2022-02-28'], 'value': [10, 20, 30, 40,0, 20, 20, 40,10, 20 ] })
期望输出:
output_df = pd.DataFrame({ 'group': ['A', 'A', 'A','A', 'B','B','B','B','A','B'], 'date': ['2020-01-31', '2021-01-31', '2020-03-31','2021-03-31', '2020-01-31', '2021-01-31', '2020-03-31','2021-03-31','2022-01-31', '2022-02-28'], 'value': [15, 20, 35, 40, 10, 20, 30, 40,10, 20 ] })
解决方案
步骤1:处理日期字段
先将date列转换为datetime类型,再提取年份和月份字段,为后续按「分组+月份」聚合计算做准备:
input_df['date'] = pd.to_datetime(input_df['date']) input_df['year'] = input_df['date'].dt.year input_df['month'] = input_df['date'].dt.month
步骤2:计算目标均值
筛选出2020和2021年的数据,按group和month分组后,计算每组的均值:
mean_df = (input_df[input_df['year'].isin([2020, 2021])] .groupby(['group', 'month'])['value'] .mean() .reset_index(name='mean_value'))
步骤3:替换2020年的数据
将原数据与均值表合并,对2020年的行用均值替换原value,最后清理临时字段:
merged = input_df.merge(mean_df, on=['group', 'month'], how='left') merged['value'] = merged.apply(lambda row: row['mean_value'] if row['year'] == 2020 else row['value'], axis=1) result = merged.drop(['year', 'month', 'mean_value'], axis=1)
验证结果
运行上述代码后,result与期望输出一致:
group date value 0 A 2020-01-31 15.0 1 A 2021-01-31 20.0 2 A 2020-03-31 35.0 3 A 2021-03-31 40.0 4 B 2020-01-31 10.0 5 B 2021-01-31 20.0 6 B 2020-03-31 30.0 7 B 2021-03-31 40.0 8 A 2022-01-31 10.0 9 B 2022-02-28 20.0
内容的提问来源于stack exchange,提问作者NAS_2339
相关产品推荐
相关产品推荐

