【问题标题】:How to fillna the last row of each group in Pandas?如何在 Pandas 中填写每组的最后一行?
【发布时间】:2014-01-22 13:43:20
【问题描述】:

我有一个数据框 df,其每组的最后一行 (groupby STK_ID) 是 NaN:

>>> print df
                   sales  opr_pft  net_pft
STK_ID RPT_Date                           
002138 20130331   2.0703   0.3373   0.2829
       20130630      NaN      NaN      NaN
       20130930   7.4993   1.2248   1.1630
       20140122      NaN      NaN      NaN
600004 20130331  11.8429   3.0816   2.1637
       20130630  24.6232   6.2152   4.5135
       20130930  37.9673   9.2088   6.6463
       20140122      NaN      NaN      NaN
600809 20130331  27.9517   9.9426   7.5182
       20130630  40.6460  13.9414   9.8572
       20130930  53.0501  16.8081  11.8605
       20140122      NaN      NaN      NaN

现在我想用前一行填充每组的最后一行,结果应该是这样的:

                   sales  opr_pft  net_pft
STK_ID RPT_Date                           
002138 20130331   2.0703   0.3373   0.2829
       20130630      NaN      NaN      NaN    **(Not fillna this row)**
       20130930   7.4993   1.2248   1.1630
       20140122   7.4993   1.2248   1.1630
600004 20130331  11.8429   3.0816   2.1637
       20130630  24.6232   6.2152   4.5135
       20130930  37.9673   9.2088   6.6463
       20140122  37.9673   9.2088   6.6463
600809 20130331  27.9517   9.9426   7.5182
       20130630  40.6460  13.9414   9.8572
       20130930  53.0501  16.8081  11.8605
       20140122  53.0501  16.8081  11.8605

我几乎可以通过:df.groupby(level=0).apply(lambda grp: grp.fillna(method='ffill')) 完成它,生成如下:

                   sales  opr_pft  net_pft
STK_ID RPT_Date                           
002138 20130331   2.0703   0.3373   0.2829
       20130630   2.0703   0.3373   0.2829
       20130930   7.4993   1.2248   1.1630
       20140122   7.4993   1.2248   1.1630
600004 20130331  11.8429   3.0816   2.1637
       20130630  24.6232   6.2152   4.5135
       20130930  37.9673   9.2088   6.6463
       20140122  37.9673   9.2088   6.6463
600809 20130331  27.9517   9.9426   7.5182
       20130630  40.6460  13.9414   9.8572
       20130930  53.0501  16.8081  11.8605
       20140122  53.0501  16.8081  11.8605

这不是我想要的,它通过组内的所有行来填充。那么如何在 Pandas 中填充每组的最后一行呢?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以在 groupby 中使用另一个函数:

    def f(g):
        last = len(g.values)-1
        g.iloc[last,:] = g.iloc[last-1,:]
        return g
    print df.groupby(level=0).apply(f)
    

    输出:

                       sales  opr_pft  net_pft
    STK_ID RPT_Date                           
    2138   20130331   2.0703   0.3373   0.2829
           20130630      NaN      NaN      NaN
           20130930   7.4993   1.2248   1.1630
           20140122   7.4993   1.2248   1.1630
    600004 20130331  11.8429   3.0816   2.1637
           20130630  24.6232   6.2152   4.5135
           20130930  37.9673   9.2088   6.6463
           20140122  37.9673   9.2088   6.6463
    600809 20130331  27.9517   9.9426   7.5182
           20130630  40.6460  13.9414   9.8572
           20130930  53.0501  16.8081  11.8605
           20140122  53.0501  16.8081  11.8605
    

    【讨论】:

    • 将 'g.iloc[last,:] = g.iloc[last-1,:]' 更改为 'g.iloc[last-1:,:].fillna(method='ffill ',inplace=True)'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2019-05-24
    • 2018-04-27
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多