pandas df 对任意 n 行满足条件的行进行过滤

pandas df filter on rows with any n rows satisfying condition

我有一个包含许多列的 df,我想 select 所有具有任何 2 个非零列值的行。过滤特定列为非零的行是微不足道的,我的意思是这可能也是微不足道的,但它让我望而却步。 have/want 以下可重现示例的数据帧:

import pandas as pd

have = pd.DataFrame({'ID': [1,2,3,4,5],
        'grp1': [1,0,0,0,0],
        'grp2': [0,2,0,0,0],
        'grp3': [1,1,0,0,5]})

want = have.iloc[0:2]
>>> want
   ID  grp1  grp2  grp3
0   1     1     0     1
1   2     0     2     1

最后一个注意事项 - 我经常在 pandas 和 sql(ite) 之间来回传递,所以如果在 sql 中有比 pandas 我想念的,我也对此持开放态度。

在pandas中:

have[have.iloc[:,1:].gt(0).sum(1).gt(1)]
 
   ID  grp1  grp2  grp3
0   1     1     0     1
1   2     0     2     1

IIUC,你需要:

have.loc[(have.iloc[:,1:]!=0).sum(1)>1] 正如你所说 non-zero 值。

您可以将列类型转换为 bool,然后零将是 Fasle,非零将是 True,然后对 True 求和以获得非零计数。

out = have[have.filter(like='grp').astype(bool).sum(axis=1).ge(2)]
print(out)

   ID  grp1  grp2  grp3
0   1     1     0     1
1   2     0     2     1