【问题标题】:Pandas row-wise aggregation with multi-index具有多索引的 Pandas 行聚合
【发布时间】:2019-03-08 22:49:11
【问题描述】:

我有一个 pandas 数据框,其中包含三个级别的行索引。最后一级是日期时间索引。有 nan 值,我试图用日期时间级别的每一行的平均值填充它们。我该怎么做?

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

有些行可能都是 nan 值。在这种情况下,我想用 0 填充该行。某些行可能已填写所有值,因此不需要使用平均值进行估算。

我想要以下结果:

Level 0 | Level 1 |        Level 2      |      
A           123     2019-01-28 17:00:00 |   3  |  1    | 2
                    2019-01-28 18:00:00 |   2  |  1.5  | 1
                    2019-01-28 19:00:00 |  5   |  5    | 5
            234     2019-01-28 05:00:00 |   1  |  1    | 3
                    2019-01-28 06:00:00 |   0  |  0  | 0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    每行使用DataFrame.maskmean,最后只转换NaNs 行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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-18
      • 2018-12-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 2021-02-22
      • 2021-04-20
      相关资源
      最近更新 更多