如何根据行范围内的满足条件删除列?

时间:2017-04-21 09:15:29

标签: python pandas

我对熊猫很新,如果它满足一系列行的条件,我想删除一个列。

                  A         B         C         D  
  2017-01-01   0.132003 -0.827317 -0.076467 -1.187678
  2017-01-02   1.130127  NaN      -1.413681  
  2017-01-03   3.546974  NaN      -1.555685  1.666978 
  2017-01-04   0.974466  NaN      -0.410001 -0.078638

我想生成一个新的df,没有任何列在最后2个日期给出NaN。

1 个答案:

答案 0 :(得分:2)

您可以使用locmask进行过滤 - 获取True时的列:

print (df.loc[:,~df.iloc[-2:].isnull().all()])
                   A         C         D
2017-01-01  0.132003 -0.076467 -1.187678
2017-01-02  1.130127 -1.413681       NaN
2017-01-03  3.546974 -1.555685  1.666978
2017-01-04  0.974466 -0.410001 -0.078638

<强>解释

首先按iloctail选择最后两行:

print (df.iloc[-2:])
#alternative
#print (df.tail(2))
                   A   B         C         D
2017-01-03  3.546974 NaN -1.555685  1.666978
2017-01-04  0.974466 NaN -0.410001 -0.078638

检查isnull

print (df.iloc[-2:].isnull())
                A     B      C      D
2017-01-03  False  True  False  False
2017-01-04  False  True  False  False

检查all列中的所有值是否为True

print (df.iloc[-2:].isnull().all())
A    False
B     True
C    False
D    False
dtype: bool

~反转boollean面具:

print (~df.iloc[-2:].isnull().all())
A     True
B    False
C     True
D     True
dtype: bool

编辑:

也可以通过loc选择另一个切片:

print (df.loc['2017-01-03':'2017-01-04'])
                   A   B         C         D
2017-01-03  3.546974 NaN -1.555685  1.666978
2017-01-04  0.974466 NaN -0.410001 -0.078638

print (df.loc[:,~df.loc['2017-01-03':'2017-01-04'].isnull().all()])
                   A         C         D
2017-01-01  0.132003 -0.076467 -1.187678
2017-01-02  1.130127 -1.413681       NaN
2017-01-03  3.546974 -1.555685  1.666978
2017-01-04  0.974466 -0.410001 -0.078638