比较pandas中groupby对象中的列

时间:2017-03-19 00:51:03

标签: python pandas

我的数据框如下所示:

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的限制。

我怎样才能有效地在熊猫中做到这一点?

提前致谢!

3 个答案:

答案 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