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

时间:2015-05-26 00:19:52

标签: python numpy pandas

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

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(实质上是一个集合交集),以确定哪些是具有有效数据的时间戳或行(非nan })在所有列中。我可以将以下内容视为一种可能的解决方案:

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

但是看起来有点神秘,用DataFrame方法有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

结合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()而不是实现掩码更简单,但是使用明确的掩码也很方便。