将pandas框架切片到所有包含值的列的第一个示例

vltsax25  于 6个月前  发布在  其他
关注(0)|答案(3)|浏览(68)

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

lbsnaicq

lbsnaicq1#

可以使用.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

字符串

dgtucam1

dgtucam12#

你可以使用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

t5zmwmid

t5zmwmid3#

您可以获取非空数据子集的第一个索引值(跨行,或轴=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

字符串

相关问题