首页 > 解决方案 > 仅当与 Python 相同年份和月份的值时才应用 fillna(method='bfill')

问题描述

假设我有一个面板数据框,NaN里面有很多 s 如下:

import pandas as pd
import numpy as np

np.random.seed(2021)
dates = pd.date_range('20130226', periods=720)
df = pd.DataFrame(np.random.randint(0, 100, size=(720, 3)), index=dates, columns=list('ABC'))
for col in df.columns:
    df.loc[df.sample(frac=0.4).index, col] = pd.np.nan
df

出去:

               A     B     C
2013-02-26   NaN   NaN   NaN
2013-02-27   NaN   NaN  44.0
2013-02-28  62.0   NaN  29.0
2013-03-01  21.0   NaN  24.0
2013-03-02  12.0  70.0  70.0
          ...   ...   ...
2015-02-11  38.0  42.0   NaN
2015-02-12  67.0   NaN   NaN
2015-02-13  27.0  10.0  74.0
2015-02-14  18.0   NaN   NaN
2015-02-15   NaN   NaN   NaN

仅当它们相同df.fillna(method='bfill')并且:df.fillna(method='ffill')yearmonth

例如,如果我 apply df.fillna(method='bfill'),预期的结果将是这样的:

               A     B     C
2013-02-26  62.0   NaN  44.0
2013-02-27  62.0   NaN  44.0
2013-02-28  62.0   NaN  29.0
2013-03-01  21.0  70.0  24.0
2013-03-02  12.0  70.0  70.0
          ...   ...   ...
2015-02-11  38.0  42.0  74.0
2015-02-12  67.0  10.0  74.0
2015-02-13  27.0  10.0  74.0
2015-02-14  18.0   NaN   NaN
2015-02-15   NaN   NaN   NaN

我怎么能在 Pandas 中做到这一点?谢谢。

标签: pythonpython-3.xpandasdataframenumpy

解决方案


您可以resampleM(月)和transform bfill

>>> df.resample("M").transform('bfill')
               A     B     C
2013-02-26  62.0   NaN  44.0
2013-02-27  62.0   NaN  44.0
2013-02-28  62.0   NaN  29.0
2013-03-01  21.0  70.0  24.0
2013-03-02  12.0  70.0  70.0
...          ...   ...   ...
2015-02-11  38.0  42.0  74.0
2015-02-12  67.0  10.0  74.0
2015-02-13  27.0  10.0  74.0
2015-02-14  18.0   NaN   NaN
2015-02-15   NaN   NaN   NaN

[720 rows x 3 columns]
>>> 

对于特定列:

>>> df[['A', 'B']] = df.resample("M")[['A', 'B']].transform('bfill')
>>> df
               A     B     C
2013-02-26  62.0   NaN   NaN
2013-02-27  62.0   NaN  44.0
2013-02-28  62.0   NaN  29.0
2013-03-01  21.0  70.0  24.0
2013-03-02  12.0  70.0  70.0
...          ...   ...   ...
2015-02-11  38.0  42.0   NaN
2015-02-12  67.0  10.0   NaN
2015-02-13  27.0  10.0  74.0
2015-02-14  18.0   NaN   NaN
2015-02-15   NaN   NaN   NaN

[720 rows x 3 columns]
>>> 

推荐阅读