2015-05-20 170 views
22

我想用另一列的值填充一列中的缺失值。熊猫 - FillNa与另一列

我读过循环遍历每行将是非常糟糕的做法,并且最好是一次性完成所有事情,但我无法找到如何使用fillna方法来完成此操作。

数据之前

Day Cat1 Cat2 
1 cat mouse 
2 dog elephant 
3 cat giraf 
4 NaN ant 

数据后

Day Cat1 Cat2 
1 cat mouse 
2 dog elephant 
3 cat giraf 
4 ant ant 

回答

45

您可以提供此列fillna(见docs),它将使用匹配的索引这些值来填充:

In [17]: df['Cat1'].fillna(df['Cat2']) 
Out[17]: 
0 cat 
1 dog 
2 cat 
3 ant 
Name: Cat1, dtype: object 
+0

不错!我不知道''fillna''需要一个系列。 –

+0

谢谢!我认为这个系列必须是NA值的确切数量。 – xav

4

你可以做

df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1) 

在RHS整体结构使用the ternary pattern from the pandas cookbook(这是值得的阅读在任何情况下) 。这是一个矢量版本a? b: c

+0

不我用这个问题的解决方案,但非常有趣的模式!谢谢! – xav

4

只需使用value参数,而不是method

In [20]: df 
Out[20]: 
    Cat1  Cat2 Day 
0 cat  mouse 1 
1 dog elephant 2 
2 cat  giraf 3 
3 NaN  ant 4 

In [21]: df.Cat1 = df.Cat1.fillna(value=df.Cat2) 

In [22]: df 
Out[22]: 
    Cat1  Cat2 Day 
0 cat  mouse 1 
1 dog elephant 2 
2 cat  giraf 3 
3 ant  ant 4 
+0

感谢您的回答!使用价值而不是joris描述的方法会改变什么? – xav

+0

@xav'value'是第一个参数,所以joris实际上在做同样的事情。正如他所说,请参阅[文档](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.fillna.html)。 – chrisaycock

+0

是的,文档字符串有点误导,因为'方法'首先在那里列出。 – joris