假设我有一个带有一些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,一个元素一个元素地循环,然后直接设置值,但是有没有一种简单的(最好是无循环的)方法来实现这一点呢?


当前回答

ffill现在有自己的方法pd. dataframe。ffill

df.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

其他回答

ffill现在有自己的方法pd. dataframe。ffill

df.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

只是同意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

还有熊猫。插值,我认为它提供了更多的控制

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,让事情简单点。

在我的例子中,我们有来自不同设备的时间序列,但有些设备在一段时间内无法发送任何值。所以我们应该为每个设备和时间段创建NA值,然后做fillna。

df = pd.DataFrame([["device1", 1, 'first val of device1'], ["device2", 2, 'first val of device2'], ["device3", 3, 'first val of device3']])
df.pivot(index=1, columns=0, values=2).fillna(method='ffill').unstack().reset_index(name='value')

结果:

        0   1   value
0   device1     1   first val of device1
1   device1     2   first val of device1
2   device1     3   first val of device1
3   device2     1   None
4   device2     2   first val of device2
5   device2     3   first val of device2
6   device3     1   None
7   device3     2   None
8   device3     3   first val of device3