假设我有一个带有一些nan的数据框架:
>>> 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,一个元素一个元素地循环,然后直接设置值,但是有没有一种简单的(最好是无循环的)方法来实现这一点呢?
可以使用fillna删除或替换NaN值。
南删除
import pandas as pd
df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df.fillna(method='ffill')
0 1 2
0 1.0 2.0 3.0
1 4.0 2.0 3.0
2 4.0 2.0 9.0
南Replace
df.fillna(0) # 0 means What Value you want to replace
0 1 2
0 1.0 2.0 3.0
1 4.0 0.0 0.0
2 0.0 0.0 9.0
参考pandas.DataFrame.fillna
可以使用fillna删除或替换NaN值。
南删除
import pandas as pd
df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df.fillna(method='ffill')
0 1 2
0 1.0 2.0 3.0
1 4.0 2.0 3.0
2 4.0 2.0 9.0
南Replace
df.fillna(0) # 0 means What Value you want to replace
0 1 2
0 1.0 2.0 3.0
1 4.0 0.0 0.0
2 0.0 0.0 9.0
参考pandas.DataFrame.fillna
还有熊猫。插值,我认为它提供了更多的控制
import pandas as pd
df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df=df.interpolate(method="pad",limit=None, downcast="infer") #downcast keeps dtype as int
print(df)
0 1 2
0 1 2 3
1 4 2 3
2 4 2 9
你可以使用pandas.DataFrame.fillna的method='ffill'选项。'ffill'代表'向前填充',并将传播最后有效的观察向前。另一种方法是'bfill',它的工作方式相同,但相反。
import pandas as pd
df = 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
还有一个直接的同义词函数pandas.DataFrame。Ffill,让事情简单点。
只是同意ffill方法,但一个额外的信息是,你可以限制向前填充关键字参数限制。
>>> import pandas as pd
>>> df = pd.DataFrame([[1, 2, 3], [None, None, 6], [None, None, 9]])
>>> df
0 1 2
0 1.0 2.0 3
1 NaN NaN 6
2 NaN NaN 9
>>> df[1].fillna(method='ffill', inplace=True)
>>> df
0 1 2
0 1.0 2.0 3
1 NaN 2.0 6
2 NaN 2.0 9
现在使用limit关键字参数
>>> df[0].fillna(method='ffill', limit=1, inplace=True)
>>> df
0 1 2
0 1.0 2.0 3
1 1.0 2.0 6
2 NaN 2.0 9