【发布时间】:2013-11-21 18:55:50
【问题描述】:
我在我的 DataFrame df 上使用 pandas groupby,其中包含 type、subtype 和其他 11 个列。然后我用我的combine_function(需要一个更好的名字)在以下群组中调用apply:
grouped = df('type')
reduced = grouped.apply(combine_function)
我的combine_function 检查组中的任何元素是否包含具有给定子类型的任何元素,例如 1,如下所示:
def combine_function(group):
if 1 in group.subtype:
return aggregate_function(group)
else:
return group
combine_function 然后可以调用aggregate_function,计算汇总统计信息,将它们存储在第一行,然后将该行设置为组。它看起来像:
def aggregate_function(group):
first = group.first_valid_index()
group.value1[group.index == first] = group.value1.mean()
group.value2[group.index == first] = group.value2.max()
group.value3[group.index == first] = group.value3.std()
group = group[(group.index == first)]
return group
我很确定这不是最好的方法,但它一直在给我想要的结果,99.9% 的时间在数千个 DataFrame 上。但是,它有时会引发一个错误,该错误与我不想聚合的组正好有 2 行相关:
ValueError: Shape of passed values is (13,), indices imply (13, 5)
我的示例组的大小:
In [4]: grouped.size()
Out[4]:
type
1 9288
3 7667
5 7604
11 2
dtype: int64
它处理了 3 三个罚款,然后在尝试合并所有内容时出错。如果我注释掉 group = group[(group.index == first)] 行,请更新,但不要在所有组上汇总或调用我的 aggregate_function,这很好。
有谁知道对某些组进行这种聚合而不是其他组的正确方法?
【问题讨论】:
-
你试过只使用apply吗?