2013-06-20 87 views
4

我试图连接几个列其中大多包含NaN的一个,但这里是只有2个例子:串联列熊猫

2013-06-18 21:46:33.422096-05:00 A NaN 
2013-06-18 21:46:35.715770-05:00 A NaN 
2013-06-18 21:46:42.669825-05:00 NaN B 
2013-06-18 21:46:45.409733-05:00 A NaN 
2013-06-18 21:46:47.130747-05:00 NaN B 
2013-06-18 21:46:47.131314-05:00 NaN B 

这可能会持续3或4或10列,总1为pd.notnull(),其余为NaN。

我想将它们连接成1列,尽可能最快的方式。我怎样才能做到这一点?

回答

5

你得到每行一个字符串和其他细胞NaN,然后运用数学是要求为max值:

df.max(axis=1) 

按照评论,如果它没有在Python 3工作,请将您的NaN投射到以前的字符串中:

df.fillna('').max(axis=1) 
+0

仅供参考,这将无法在python 3中工作。我不记得细节,但我改变了字符串和数字的比较。在python 3中,它返回所有的nans。 – TomAugspurger

+0

@TomAugspurger谢谢你的评论,我相应修改了答案 – Boud

0

你可以做

In [278]: df = pd.DataFrame([[1, np.nan], [2, np.nan], [np.nan, 3]]) 

In [279]: df 
Out[279]: 
    0 1 
0 1 NaN 
1 2 NaN 
2 NaN 3 

In [280]: df.sum(1) 
Out[280]: 
0 1 
1 2 
2 3 
dtype: float64 

由于NaN s的0相加的时候,他们不露面处理。

一些注意事项:您需要确保只有其中一列有一个非楠为此工作。它也只适用于数字数据。

您还可以使用

df.fillna(method='ffill', axis=1).iloc[:, -1] 

最后一列现在将包含所有有效的意见,因为有效问卷已经充满进取。请参阅文档here。第二种方式应该更灵活,但速度更慢。我用iloc[:, -1]切掉每一行和最后一列。

+0

我的不好,这绝对是字符串。将编辑 – user1610719

+0

所以我会尝试第二个选项,但我很惊讶没有一个更简单的选项。这实际上只是再次进行concatting,但只是使用列而不是数据框。 – user1610719