我有一个pandas数据框,其中有三个级别的行索引。最后一级是日期时间索引。有nan值,我试图用datetime级别的每一行的平均值填充它们。我该怎么做呢?
export function* create(action) {
try {
const { payload } = action;
const response = yield call(api.addPost, payload);
if (response.status === 200) {
console.log('pass 200 check');
yield put(appActions.setResourceResponse(response.data));
console.log(response.data);
payload.push('/add-news');
}
} catch (error) {
console.log(error);
yield put(
a.setResponse({
message: error.response.data,
status: error.response.status,
}),
);
}
}
某些行可能都是nan值。在这种情况下,我想用0填充行。某些行可能会填入所有值,因此不需要使用平均值进行估算。
我想要以下结果:
data_df
Level 0 | Level 1 | Level 2 |
A 123 2019-01-28 17:00:00 | 3 | 1 | nan
2019-01-28 18:00:00 | 2 | nan | 1
2019-01-28 19:00:00 | nan | nan | 5
234 2019-01-28 05:00:00 | 1 | 1 | 3
2019-01-28 06:00:00 | nan | nan | nan
答案 0 :(得分:1)
将DataFrame.mask
与每行mean
一起使用,最后仅将NaN
的行转换为DataFrame.fillna
:
df = df.mask(df.isna(), df.mean(axis=1), axis=0).fillna(0)
print (df)
a b c
Level 0 Level 1 Level 2
A 123 2019-01-28 17:00:00 3.0 1.0 2.0
2019-01-28 18:00:00 2.0 1.5 1.0
2019-01-28 19:00:00 5.0 5.0 5.0
234 2019-01-28 05:00:00 1.0 1.0 3.0
2019-01-28 06:00:00 0.0 0.0 0.0
另一种解决方案是使用DataFrame.fillna
进行替换,但是由于未实现的df.fillna(df.mean(axis=1), axis=1)
是必需的双重转置:
df = df.T.fillna(df.mean(axis=1)).fillna(0).T