2016-05-17 171 views
0

我已經分組了數據框,我想根據這些值過濾每個組內的值。過濾組內大熊貓

我想:

figure_cols = list("ABC") 

def get_threshold_for_IV(gr_vals): 
    return (gr_vals[figure_cols].max())/(gr_vals["A"].count()) 

def filter_IV(group): 
    A_tr, B_tr, C_tr = get_threshold_for_IV(group) 
    return group[(group.A >= A_tr) & (group.B >= B_tr) & (group.C >= C_tr)] 

# 1 attempt 
grouped.apply(filter_IV) 

# 2 attempt 
for name, group in grouped: 
    A_tr, B_tr, C_tr = get_threshold_for_IV(group) 
    group = group[(group.A < A_tr) & (group.B < B_tr) & (group.C < C_tr)] 

但沒有任何工程。數據沒有改變。 我的功能正常。如果我在循環中插入print,我可以看到過濾結果。

其他的事情我應該說,我想有過濾操作後,分組的對象做進一步的操作

我讀過的文檔,但它看起來像我看不見它。任何人都可以幫忙嗎?

編輯

新增自包含例如:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'gr' : ['foo', 'bar', 'foo', 'bar', 
         'foo', 'bar', 'foo', 'foo'], 
        'A' : np.arange(8), 
        'B' : np.random.randn(8), 
        'C' : np.random.randn(8)}) 

def filter_gt_3(group): 
    return group[group.A < 3] 

grouped = df.groupby('gr') 
for name, group in grouped: 
    print 'group name: %s' % name 
    print group 
    group = filter_gt_3(group) 
    print "\nfiltered" 
    print group 


print '\n----------\n' 
print 'Nothing filtered:\n' 
for name, group in grouped: 
    print 'group name: %s' % name 
    print group 

輸出

group name: bar 
    A   B   C gr 
1 1 1.486028 -0.382597 bar 
3 3 -0.501757 -0.771807 bar 
5 5 -0.836930 -1.514824 bar 

filtered 
    A   B   C gr 
1 1 1.486028 -0.382597 bar 

group name: foo 
    A   B   C gr 
0 0 0.678104 -0.940245 foo 
2 2 1.539903 1.460493 foo 
4 4 -0.033421 -1.078566 foo 
6 6 1.146298 0.039721 foo 
7 7 1.095707 -1.032275 foo 

filtered 
    A   B   C gr 
0 0 0.678104 -0.940245 foo 
2 2 1.539903 1.460493 foo 

---------- 

Nothing filtered: 

group name: bar 
    A   B   C gr 
1 1 1.486028 -0.382597 bar 
3 3 -0.501757 -0.771807 bar 
5 5 -0.836930 -1.514824 bar 
group name: foo 
    A   B   C gr 
0 0 0.678104 -0.940245 foo 
2 2 1.539903 1.460493 foo 
4 4 -0.033421 -1.078566 foo 
6 6 1.146298 0.039721 foo 
7 7 1.095707 -1.032275 foo 
+0

您能否提供一個自包含的,可運行的示例來演示此問題? – BrenBarn

+0

@BrenBarn我已經添加了示例 –

回答

1

group = filter_gt_3(group)不會修改原始數據。它只是將過濾的數據分配給一個稱爲group的局部變量。同樣,只需撥打groupby.apply(如您的第一個示例)不會修改任何內容。如果您想對已過濾的數據執行任何操作,則需要使用這些操作返回的值

如果你想要得到的過濾後的數據,這樣做

new_data = df.groupby('gr').apply(filter_gt_3) 

注意,這也不會修改原始數據:它會創建一個新的數據框並將其分配給new_data。如果您願意,您可以將其指定爲原始名稱(例如,df = df.groupby...

+0

是的,我明白這一點。所以要用同一組進行其他操作,我應該再次使用「groupby」? –

+0

@ re-gor:是的。 (或者你可以寫一個函數來完成你想要的所有操作。) – BrenBarn

+0

謝謝,有時熊貓對我來說看起來並不明顯。 –