如何在pandas DataFrame中使用前面或下一个值替换NaN?
如何在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日
接受的答案是完美的。我有一个相关但略有不同的情况,需要填补前进,但只在组内填补。如果有人有相同的需求,可以了解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
你可以在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)