我有简单的pandas时间序列数据帧,类似于:
In [69]: df
Out[69]:
A B
Date
2015-01-01 NaN NaN
2015-02-01 1.1 NaN
2015-03-01 NaN NaN
2015-04-01 1.2 NaN
2015-05-01 1.5 1.2
2015-06-01 1.6 1.9
2015-07-01 1.3 NaN
2015-08-01 1.2 3.0
2015-09-01 1.1 1.1
从第一个点开始获取数据帧的最佳方法是什么?在所有列中都有值,即以编程方式获得此输出?
In [71]: df.ix[4:]
Out[71]:
A B
Date
2015-05-01 1.5 1.2
2015-06-01 1.6 1.9
2015-07-01 1.3 NaN
2015-08-01 1.2 3.0
2015-09-01 1.1 1.1
答案 0 :(得分:4)
您可以使用.first_valid_index()
获取列的第一个非NaN索引。
# your data
# ============================
df
A B
Date
2015-01-01 NaN NaN
2015-02-01 1.1 NaN
2015-03-01 NaN NaN
2015-04-01 1.2 NaN
2015-05-01 1.5 1.2
2015-06-01 1.6 1.9
2015-07-01 1.3 NaN
2015-08-01 1.2 3.0
2015-09-01 1.1 1.1
# processing
# ================================
# get the first valid index for each column
# and calculate the max
first_valid_loc = df.apply(lambda col: col.first_valid_index()).max()
df.loc[first_valid_loc:]
A B
Date
2015-05-01 1.5 1.2
2015-06-01 1.6 1.9
2015-07-01 1.3 NaN
2015-08-01 1.2 3.0
2015-09-01 1.1 1.1
答案 1 :(得分:1)
您可以使用dropna
的默认行为,并使用第一个索引来分割您的df:
In [21]:
df.loc[df.dropna().index[0]:]
Out[21]:
A B
Date
2015-05-01 1.5 1.2
2015-06-01 1.6 1.9
2015-07-01 1.3 NaN
2015-08-01 1.2 3.0
2015-09-01 1.1 1.1
这样可行,因为它将删除包含单个NaN
的所有行,因此您只需使用此中的第一个索引值来切片df:
In [22]:
df.dropna()
Out[22]:
A B
Date
2015-05-01 1.5 1.2
2015-06-01 1.6 1.9
2015-08-01 1.2 3.0
2015-09-01 1.1 1.1
答案 2 :(得分:1)
您可以获取非空数据子集的第一个索引值(跨行,或轴= 1)。然后使用.ix
从此索引值中选择所有数据。
idx = df[df.notnull().all(axis=1)].index[0]
>>> df.ix[idx:]
A B
Date
5/1/15 1.5 1.2
6/1/15 1.6 1.9
7/1/15 1.3 NaN
8/1/15 1.2 3.0
9/1/15 1.1 1.1