2017-03-19 190 views
0

我的數據框看起來是這樣的:比較GROUPBY對象中列大熊貓

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 

我想GROUPBY ID,然後獲取其花費列小於或等於在每一行限制列的ID按對象分組。

對於我上面的例子中,我應該得到的id 1和3我的結果,因爲ID 2在3個月花費101,因此超過100

限制我怎樣才能在大熊貓有效做到這一點?

提前致謝!

回答

1

你可以通過找到度過了IDS創建模板是大於限制。在面具

mask = df.loc[df['spent'] > df['limit'], 'id'].values.tolist() 
df.id[df['id'] != mask].unique() 

面具出來的ID給你

array([1, 3]) 
1

這應該給你的東西像你想

df.groupby('id').apply(lambda g: (g.spent < g.limit).all()).to_frame('not_exceeded').query('not_exceeded == True') 
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