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
我有一个包含许多列的 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