我的数据框如下所示:
id month spent limit
1 1 2.6 10
1 2 4 10
1 3 6 10
2 1 3 100
2 2 89 100
2 3 101 100
3 1 239 500
3 2 432 500
3 3 100 500
我想分组id,然后获取已用过的列小于或等于对象的每个行的限制列的ID。
对于我上面的例子,我应该得到id 1和3作为我的结果,因为id 2在第3个月花费101,因此超过了100的限制。
我怎样才能有效地在熊猫中做到这一点?
提前致谢!
答案 0 :(得分:1)
这应该会给你一些你想要的东西
df.groupby('id').apply(lambda g: (g.spent < g.limit).all()).to_frame('not_exceeded').query('not_exceeded == True')
答案 1 :(得分:1)
您可以通过查找花费大于限制的ID来创建蒙版。屏蔽掩码中的ID
mask = df.loc[df['spent'] > df['limit'], 'id'].values.tolist()
df.id[df['id'] != mask].unique()
给你
array([1, 3])
答案 2 :(得分:1)
逆向逻辑!检查花费大于限制的唯一ID。然后过滤掉那些。
df[~df.id.isin(df.set_index('id').query('limit < spent').index.unique())]
id month spent limit
0 1 1 2.6 10
1 1 2 4.0 10
2 1 3 6.0 10
6 3 1 239.0 500
7 3 2 432.0 500
8 3 3 100.0 500