2016-05-17 173 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

谢谢,有时熊猫对我来说看起来并不明显。 –