Pandas groupby应用功能组合了一些组而不是其他组

时间:2013-11-21 18:55:50

标签: python group-by pandas

我正在我的DataFrame groupby上使用pandas df,其中包含typesubtype和其他11个列。然后我在apply上使用combine_function(需要一个更好的名字)来调用 grouped = df('type') reduced = grouped.apply(combine_function) ,例如:

combine_function

我的def combine_function(group): if 1 in group.subtype: return aggregate_function(group) else: return group 检查组中的任何元素是否包含具有给定子类型的任何元素,例如1,看起来像:

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 来计算摘要统计信息,将它们存储在第一行,然后将该行设置为组。它看起来像:

ValueError: Shape of passed values is (13,), indices imply (13, 5)

我很确定这不是最好的方法,但它已经给出了我想要的结果,99.9%的时间用在数千个DataFrame上。但是,它有时会抛出一个错误,该错误与某个我不想聚合的组有两行正好相关:

In [4]: grouped.size()
Out[4]: 
type
1         9288
3         7667
5         7604
11           2
dtype: int64

我的示例组有大小:

group = group[(group.index == first)]

它处理了3三个罚款,然后在尝试组合所有内容时给出了错误。如果我将该行aggregate_function注释掉,那么请更新,但不要在所有群组中汇总或致电我的{{1}}。

有没有人知道对某些群体进行这种聚合的正确方法,而不是其他群体?

1 个答案:

答案 0 :(得分:3)

你的aggregate_functions看起来扭曲了我。聚合组时,它会自动缩减为一行;你不需要手动完成。也许我错过了这一点。 (你是否正在使用我不理解的索引做一些特别的事情?)但更正常的用法看起来像这样:

agg_condition = lambda x: Series([1]).isin(x['subtype]').any()
agg_functions = {'value1': np.mean, 'value2': np.max, 'value3': np.std}

df1 = df.groupby('type').filter(agg_condition).groupby('type').agg(**agg_functions)
df2 = df.groupby('type').filter(~agg_condition)

result = pd.concat([df1, df2])

注意:agg_condition很乱,因为(1)内置Python in是指系列的索引,而不是其值,以及(2)结果必须按any()缩小为标量。