熊猫多索引行聚合

时间:2019-03-08 14:38:36

标签: python pandas

我有一个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

1 个答案:

答案 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