我希望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
方法有更好的方法吗?
答案 0 :(得分:2)
结合notnull
和all
:
>>> 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()
而不是实现掩码更简单,但是使用明确的掩码也很方便。