我正在尝试将几个主要包含NaN的列连接到一个,但这里只是一个例子:
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列。我怎么能这样做?
答案 0 :(得分:5)
每行得到一个字符串,其他单元格为NaN
,然后要应用的数学是要求max
值:
df.max(axis=1)
根据评论,如果它在Python 3中不起作用,请在{}之前将NaN
投影到字符串中:
df.fillna('').max(axis=1)
答案 1 :(得分: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]
最后一列现在将包含所有有效的观察结果,因为有效的观察结果已经填满了。请参阅文档here。第二种方式应该更灵活但更慢。我用iloc[:, -1]
切掉每一行和最后一列。