如何在pandas DataFrame中使用前面或下一个值替换NaN?

42 浏览
0 Comments

如何在pandas DataFrame中使用前面或下一个值替换NaN?

假设我有一个含有一些NaN值的DataFrame:

>>> import pandas as pd
>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df
    0   1   2
0   1   2   3
1   4 NaN NaN
2 NaN NaN   9

我需要做的是将每个NaN用同一列中上方第一个非NaN值替换。假定第一行永远不包含NaN。因此对于前面的例子,结果将是:

   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

我可以逐列逐元素地循环整个DataFrame,直接设置值,但是否有一种简单(最好是无需循环)的方法实现这个功能呢?

admin 更改状态以发布 2023年5月24日
0
0 Comments

接受的答案是完美的。我有一个相关但略有不同的情况,需要填补前进,但只在组内填补。如果有人有相同的需求,可以了解fillna在DataFrameGroupBy对象上的工作。

>>> example = pd.DataFrame({'number':[0,1,2,nan,4,nan,6,7,8,9],'name':list('aaabbbcccc')})
>>> example
  name  number
0    a     0.0
1    a     1.0
2    a     2.0
3    b     NaN
4    b     4.0
5    b     NaN
6    c     6.0
7    c     7.0
8    c     8.0
9    c     9.0
>>> example.groupby('name')['number'].fillna(method='ffill') # fill in row 5 but not row 3
0    0.0
1    1.0
2    2.0
3    NaN
4    4.0
5    4.0
6    6.0
7    7.0
8    8.0
9    9.0
Name: number, dtype: float64

0
0 Comments

你可以在DataFrame上使用fillna方法,指定方法为ffill(向前填充):

>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df.fillna(method='ffill')
   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

该方法...

将最后一个有效观测值向前传递到下一个有效观测值

要向相反的方向前进,还有一个bfill方法。

该方法不会就地修改DataFrame-你需要重新将返回的DataFrame绑定到变量中,或者指定inplace=True

df.fillna(method='ffill', inplace=True)

0