【问题标题】:Pandas groupby apply function that combines some groups but not othersPandas groupby 应用功能结合了一些组而不是其他组
【发布时间】:2013-11-21 18:55:50
【问题描述】:

我在我的 DataFrame df 上使用 pandas groupby,其中包含 typesubtype 和其他 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吗?

标签: python group-by pandas


【解决方案1】:

你的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 指的是一个系列的 index,而不是它的值,并且 (2) 结果必须减少any() 的标量。

【讨论】:

  • 这似乎是我应该做的。我昨天玩了一些它,但它仍然给我带来了很多错误。我认为这与我对其他 8 列的处理有关,我只想在其中聚合使用第一个值。我确信有一个简单的修复方法,一旦我能正常工作,我会更新。
猜你喜欢
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 2020-03-17
  • 2021-06-03
  • 1970-01-01
  • 2014-10-12
  • 2018-11-28
  • 2021-03-12
相关资源
最近更新 更多