使用 group by 获取星期几和小时的平均值,然后使用 dow 和小时作为键映射值为 nan 的平均值
data=[
('2019-02-07 01:00:00', 15, 12, 10),
('2019-02-07 02:00:00', np.nan, 11, 9),
('2019-02-07 03:00:00', 10, 11, 3),
('2019-01-31 22:00:00', 11, np.nan, 4),
('2019-01-31 02:00:00', np.nan, 12, 4),
('2019-01-24 02:00:00', 10, 10, float('nan'))]
df=pd.DataFrame(data,columns=['date','acct1','acct2','acct3'])
df['date']=df['date'].apply(lambda row: datetime2.strptime(str(row),"%Y-%m-%d %H:%M:%S"))
df['dow']=df['date'].apply(lambda row: row.dayofweek)
df['hour']=df['date'].apply(lambda row: row.hour)
df.set_index('date')
grouped_acct1=df.groupby(['dow','hour'])['acct1'].mean()
grouped_acct2=df.groupby(['dow','hour'])['acct2'].mean()
grouped_acct3=df.groupby(['dow','hour'])['acct3'].mean()
for key,item in df.iterrows():
df.loc[key,'acct1_mean']= grouped_acct1[(grouped_acct1.index.get_level_values(0)==item.dow) & (grouped_acct1.index.get_level_values(1)==item.hour)].values
df.loc[key,'acct2_mean']= grouped_acct2[(grouped_acct2.index.get_level_values(0)==item.dow) & (grouped_acct2.index.get_level_values(1)==item.hour)].values
df.loc[key,'acct3_mean']= grouped_acct3[(grouped_acct3.index.get_level_values(0)==item.dow) & (grouped_acct3.index.get_level_values(1)==item.hour)].values
for key,item in df.iterrows():
if math.isnan(item['acct1']):
df.loc[key,'acct1']=item['acct1_mean']
else:
df.loc[key,'acct1']=item['acct1']
if math.isnan(item['acct2']):
df.loc[key,'acct2']=item['acct2_mean']
else:
df.loc[key,'acct2']=item['acct2']
if math.isnan(item['acct3']):
df.loc[key,'acct3']=item['acct3_mean']
else:
df.loc[key,'acct3']=item['acct3']
print(df)
输出
date acct1 acct2 acct3 dow hour acct1_mean acct2_mean \
0 2019-02-07 01:00:00 15.0 12.0 10.0 3 1 15.0 12.0
1 2019-02-07 02:00:00 10.0 11.0 9.0 3 2 10.0 11.0
2 2019-02-07 03:00:00 10.0 11.0 3.0 3 3 10.0 11.0
3 2019-01-31 22:00:00 11.0 NaN 4.0 3 22 11.0 NaN
4 2019-01-31 02:00:00 10.0 12.0 4.0 3 2 10.0 11.0
5 2019-01-24 02:00:00 10.0 10.0 6.5 3 2 10.0 11.0
acct3_mean
0 10.0
1 6.5
2 3.0
3 4.0
4 6.5
5 6.5