合并 Pandas 列

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列,总是有一个是pd.notnull()而其余的是NaN。

我希望以最快的方式将它们连接成一个列。我该怎么做?

2个回答

5

如果每行只有一个字符串,其他单元格都是NaN,那么应该使用的数学方法是寻找max值:

 df.max(axis=1)

根据评论,如果在Python 3中无法正常工作,请将您的NaN投影到字符串中:

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

FYI,这在Python 3中不起作用。我记不清细节了,但是他们改变了字符串和数字的比较方式。在Python 3中,它会返回所有的NaN。 - TomAugspurger
@TomAugspurger 谢谢您的评论,我已相应修改了答案。 - Zeugma

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被视为0,因此它们不会显示。

需要注意的是:您需要确保只有一个列具有非NaN值才能使其起作用。它也仅适用于数字数据。

您也可以使用

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

最后一列现在将包含所有有效的观测值,因为有效的观测值已经填充了。请参阅文档此处。第二种方法应该更加灵活但速度较慢。我使用iloc[:, -1]来切掉每一行和最后一列。


所以我将尝试第二个选项,但我很惊讶竟然没有更简单的选项。这实际上只是再次连接而已,但是只针对列而不是数据框。 - user1610719

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接