筛选条件为多列(> 100)的熊猫行

丹妮尔·奥利瓦(Daneel Olivaw)

我有一个包含20K列的数据框,我需要通过对400列应用条件来过滤特定行:

        COL1  COL2 ... COL400 total
  0      1.0  5.0      3.0    1.21
  1      1.0  NaN      NaN    4.33
  2      NaN  NaN      NaN    1.00
  3      NaN  2.0      1.0    0.12
  4      NaN  NaN      NaN    0.00
  5      1.0  3.0      4.0    3.39
  ...

我需要将包含至少1个数值的行保持在这400列中的至少一列的[1,5]之间:

        COL1  COL2 ... COL400 total
  0      1.0  5.0      3.0    1.21
  1      1.0  NaN      NaN    4.33
  3      NaN  2.0      1.0    0.12
  5      1.0  3.0      4.0    3.39
  ...

请注意,有一个额外的列总数,不应包含在此过滤中(顾名思义,在应用过滤后,我们将所有剩余行的总数相加)

到目前为止,我一直在使用较少的列的简单方法一直使用这样的方法:

df[df.eval('COL1 >= 1 & COL1 <= 5 | COL2 >= 1 & COL2 <= 5')]

但是,当处理数百个列时,这变得不切实际(并且还需要大量输入!)

我想知道在这里使用什么正确的方法。我已经开始为上述表达式添加更多条件,但是当达到30列时,我开始出现堆栈溢出或仅仅是内存错误。

我还尝试过使用其他“技巧”,例如将表达式重写为:

df[df.eval('~(COL1 != COL1 & COL2 != COL2)')]

但这又无济于事。

同样理想情况下,如果可能的话,我想使用一种简单的方法在字符串中定义布尔表达式,因为这种想法是允许最终用户为此过滤定义自定义表达式。

耶斯列尔

比较所有列,并检查True每行是否至少有一个DataFrame.any

#check values in all columns
df = df[((df >= 1) & (df <= 5)).any(axis=1)]
#check values in columns specified in list
#cols = ['COL1','COL2', ...]
#df = df[((df[cols] >= 1) & (df[cols] <= 5)).any(axis=1)]

print (df)
   COL1  COL2  COL400
0   1.0   5.0     3.0
1   1.0   NaN     NaN
3   NaN   2.0     1.0
5   1.0   3.0     4.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章