将pandas数据帧切片到包含值的所有列的第一个实例

时间:2015-07-23 22:15:30

标签: python pandas

我有简单的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

3 个答案:

答案 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