我想筛选一个pandas DataFrame,只保留那些特定分组中具有特定列值最小计数的行。
例如,仅返回df中['c2','c3']组至少有2行具有'c1'值为1的行/组:
df = pd.DataFrame({'c1':[0,1,0,1,1,0], 'c2':[0,0,0,1,1,1], 'c3':[0,0,0,1,1,1]})
结果应该只返回索引为3、4、5的行,因为只有[c2,c3] = [1,1]的分组中至少有2行的'c1'值为1。
df.groupby(['c2','c3']).filter(lambda x: x['c1'].count() >= 2)
不返回所需结果。 我需要的计数仅适用于 1 的计数,而不仅仅是任何 'c1' 值的计数。
以下代码可以工作,但我不确定如何使其更具 Pythonic 风格:
s = df.groupby(['c2','c3']).apply(lambda x: x[x['c1']==1].count() >= 2).all(axis=1)
df = df.reset_index().set_index(['c2','c3']).loc[s[s].index].reset_index().set_index(['index'])
.eq()
返回一个布尔序列,当你应用像.sum
这样的操作时,它会将 True 强制转换为 1,False 强制转换为 0。 - ALollz.assign
创建您需要求和的列,然后传递要分组的列的列表。m = df.assign(to_sum = df.c1.eq(1)).groupby(['c2', 'c3']).to_sum.transform('sum').ge(2)
- ALollz