用Pandas2020年和2021年数据的平均值替换2020行的值

qv7cva1a  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(87)

我有一个包含分组、日期和值列的数据框。我的日期是每月一次。由于我的2020年数据受到Covid的影响,我想用2020年和2021年的平均值插补它。在数据框中,我如何执行此操作?

input = 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= 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 ]
})
bbuxkriu

bbuxkriu1#

用途:

#convert to datetimes
input['date'] = pd.to_datetime(input['date'])

#extract years
y = input['date'].dt.year

#filter only 2020, 2021 years
mask = y.isin([2020,2021])
df = input[mask]

#get means per group and MM-DD from dates
s = df.groupby(['group', df['date'].dt.strftime('%m-%d')])['value'].transform('mean')

#for 2020 replace values by means
df = input.assign(value = input['value'].mask(y.eq(2020) & mask, s))
print (df)
  group       date  value
0     A 2020-01-31     15
1     A 2021-01-31     20
2     A 2020-03-31     35
3     A 2021-03-31     40
4     B 2020-01-31     10
5     B 2021-01-31     20
6     B 2020-03-31     30
7     B 2021-03-31     40
8     A 2022-01-31     10
9     B 2022-02-28     20

相关问题