2016-05-31 89 views
0

我最近开始与熊猫一起工作,并且试图对数据进行一些简单的清理。到目前为止,我已经了解到使用熊猫时有很多单线程。所以我正在寻找一个在我的情况。我有DataFrame这样的:熊猫 - 使用其他列的值替换NaN值

C0   C1 C2   C3  C4 
    3789507  2010 NaN  NaN  NaN 
    3789508  NaN NaN  2010  NaN 
    3789509  NaN NaN  2016  NaN 
    3789510  NaN 2014  NaN  NaN 
    3789511  NaN NaN  NaN  2014 

我想这样的事情结束了:

C0   C1 
3789507  2010 
3789508  2010 
3789509  2016 
3789510  2014 
3789511  2014 

我现在这样简单地说就是:

k = df.C1.isnull() 
df.C1[k] = df.C2[k] 
k = df.C1.isnull() 
df.C1[k] = df.C3[k] 
k = df.C1.isnull() 
df.C1[k] = df.C4[k] 

这是工作,但并不是最好的解决方案。如果我将列100列?循环这里唯一的解决方案?

万一我的for循环看起来像这样:

for i in range(2,len(df.columns)): 
    k = df.C1.isnull() 
    df.C1[k] = df.ix[:,i] 

回答

1

大熊猫有一些方法来回填和forwardfill缺失值,所以你可以做:

df['C1'] = df.bfill(axis='columns')['C1'] 

df 
Out[10]: 
     C0  C1  C2  C3  C4 
0 3789507 2010.0  NaN  NaN  NaN 
1 3789508 2010.0  NaN 2010.0  NaN 
2 3789509 2016.0  NaN 2016.0  NaN 
3 3789510 2014.0 2014.0  NaN  NaN 
4 3789511 2014.0  NaN  NaN 2014.0 

本工程为您简单的例子数据但在真实数据集中,您可能不得不限制正在回填的列,如:

fill_cols = ['C1', 'C2', 'C3', 'C4'] 
df['C1'] = df[fill_cols].bfill(axis='columns')['C1'] 
+0

只有一个问题 - 如果它不是一个大麻烦,你能解释它是如何工作的吗?我应该从后面读吗?我的意思是这个真实的案例与选定的列。 – sebap123

+1

好的,看看'C4'有一个值的行,但其他列都丢失了。 'df.bfill(axis ='columns')'创建一个新的数据帧,该行中'C4'左边的每个缺失值从'C4'得到值。 “C4”中的有效值被“回填”到所有缺失的列中。然后,我们只需将回填的C1列复制到原始数据框中即可。 – Marius

+0

非常感谢 - 现在我明白了。 – sebap123