pandas对满足条件的任意n行进行筛选



我有一个包含许多列的df,我想选择所有具有任意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更优雅的方法,我也愿意使用。

In 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

iuc,您需要:

have.loc[(have.iloc[:,1:]!=0).sum(1)>1]如您所说的非零值。

您可以将列类型转换为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

最新更新