过滤组内的熊猫

时间:2016-05-17 04:51:01

标签: python python-2.7 pandas

我已经对数据框进行了分组,我希望根据这些值过滤每个组中的值。

我试过了:

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

1 个答案:

答案 0 :(得分:1)

执行group并不会修改原始数据。它只是将过滤后的数据分配给名为groupby.apply的局部变量。同样,只需调用new_data = df.groupby('gr').apply(filter_gt_3) (如第一个示例中所示)并不会修改任何内容。如果您想对过滤后的数据执行任何操作,则需要通过这些操作使用值返回

如果您想获取过滤后的数据,请执行

之类的操作
new_data

请注意,这也不会修改原始数据:它会创建 new DataFrame并将其分配给df = df.groupby...。如果您愿意,可以将其分配回原始名称(例如def find_display_size(d): width=float(720); height=float(1280); dens=float(294); wi=float(width)/(dens); hi=float(height)/(dens); x = math.pow(wi,2); y = math.pow(hi,2); screenInches = math.sqrt(x+y); diagScreenSizeRoundedoff = round(screenInches) logger.info("screenInches "+str(screenInches),also_console=True) logger.info("diagScreenSizeRoundedoff"+str(diagScreenSizeRoundedoff),also_console=True)