我已经对数据框进行了分组,我希望根据这些值过滤每个组中的值。
我试过了:
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 :(得分: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)
)