繁体   English   中英

如何在任何列中用nan标记DataFrame行

[英]How to mark DataFrame rows with nan in any column

我想使用带有DatetimeIndexDataFrame来对齐其时间戳上不同集合(列)的数据。 每个数据集可以具有重叠和不重叠的时间戳。 作为一个简单的例子

import pandas as pd

N = 5
ts_idx1 = pd.date_range('2015-05-22 15:00:00', periods=N, freq='10S')
a = pd.DataFrame(np.random.randn(5), index=ts_idx1, columns=['a'])

ts_idx2 = pd.date_range('2015-05-22 15:00:20', periods=N, freq='10S')
b = pd.DataFrame(np.random.randn(5), index=ts_idx2, columns=['b'])

ab_df = a.join(pd.DataFrame(b, columns=['b']), how='outer')

ab_df可能看起来像这样

                           a           b
2015-05-22 15:00:00    0.293741          nan
2015-05-22 15:00:10   -0.799414          nan
2015-05-22 15:00:20    0.361964    -0.403397
2015-05-22 15:00:30   -0.932385    -0.070403
2015-05-22 15:00:40   -0.702407     0.819322
2015-05-22 15:00:50         nan    -0.771400
2015-05-22 15:01:00         nan    -0.915791

有没有一种快速的方法来确定任何DataFrame列是否包含nan (本质上是一个集合交集),以确定哪些时间戳或行在所有列中都具有有效数据(non- nan )。 我可以认为以下是可能的解决方案:

valid_mask = [np.all(~np.isnan(x)) for x in ab_df.values]

但是似乎有点神秘,使用DataFrame方法是否有更好的方法?

还有一种将notnullall结合起来的本地方法:

>>> df.notnull().all(axis=1)
2015-05-22 15:00:00    False
2015-05-22 15:00:10    False
2015-05-22 15:00:20     True
2015-05-22 15:00:30     True
2015-05-22 15:00:40     True
2015-05-22 15:00:50    False
2015-05-22 15:01:00    False
dtype: bool
>>> [np.all(~np.isnan(x)) for x in df.values]
[False, False, True, True, True, False, False]

有时,使用df.dropna()而不是使用df.dropna()更简单,但是使用显式遮罩也很方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM