如何在熊猫数据帧中用前面的值替换NAN?

如何在熊猫数据帧中用前面的值替换NAN?

假设我有一个DataFrameNaNs:


>>> 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,逐个元素并直接设置值,但是是否有一种简单(最优无循环)的方法来实现这一点?


慕标5832272
浏览 547回答 3
3回答

侃侃无极

你可以用fillna方法,并将方法指定为ffill(前填):>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])>>> df.fillna(method='ffill')    0  1  20  1  2  31  4  2  32  4  2  9这种方法.。将最后有效的观察向前传播到下一个有效的往相反的方向走,也有一个bfill方法。此方法不修改DataFrame的位置-您需要将返回的DataFrame重新绑定到一个变量,或者指定inplace=True:df.fillna(method='ffill', inplace=True)

慕神8447489

公认的答案是完美的。我有一个相关的,但略有不同的情况,我必须填补前进,但只在小组内。如果有人有同样的需求,请知道addna在DataFrameGroupBy对象上工作。>>> example = pd.DataFrame({'number':[0,1,2,nan,4,nan,6,7,8,9],'name':list('aaabbbcccc')})>>> example  name  number0    a     0.01    a     1.02    a     2.03    b     NaN4    b     4.05    b     NaN6    c     6.07    c     7.08    c     8.09    c     9.0>>> example.groupby('name')['number'].fillna(method='ffill') # fill in row 5 but not row 30    0.01    1.02    2.03    NaN4    4.05    4.06    6.07    7.08    8.09    9.0Name: number, dtype: float64

侃侃尔雅

你可以用pandas.DataFrame.fillna带着method='ffill'选择。'ffill'代表“向前填充”,并将传播最后有效的观察向前。另一种选择是'bfill'它的工作方式是一样的,但是向后。import pandas as pddf = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])df = df.fillna(method='ffill')print(df)#   0  1  2#0  1  2  3#1  4  2  3#2  4  2  9
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python