【问题标题】:Applying a user defined function to each subgroup of Group By in Pandas在 Pandas 中将用户定义的函数应用于 Group By 的每个子组
【发布时间】:2013-12-09 21:05:28
【问题描述】:

我现在已经开始使用 pandas 了,但在按功能分组时,我真的很熟悉。

我定义了以下函数,它最终对新列 R、F、M 和 RFM 进行排序和赋值:

def get_rfm(dataframe):
    dfr=dataframe.sort('last_order_date', ascending=True)
    get_var(dfr.R)

    dff=dfr.sort('number_of_orders', ascending=True)
    get_var(dff.F)

    dfm=dff.sort('total_price',ascending=True)
    get_var(dfm.M)

    dfm.RFM[:]=dfm['R']+dfm['M']+dfm['F']
    dfrfm=dfm.sort('RFM', ascending=True)
    print(dfrfm.info())
    return dfrfm

我在我的 pandas 数据框上运行此函数,并获得看起来像预期的结果。我将它返回到一个新的 df 中,然后运行一些统计数据。

我现在要做的是在数据帧上按函数运行分组,按其他列之一对它们进行分组,然后对子组执行此分析。我试试

df.groupby('size_of_business').apply(get_rfm)

但结果不是我所期望的。我返回了一个似乎是 multiIndexed 的 Dataframe

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 57196 entries, ( Did Not Answer, 67103) to (More than 10 people, 5617)
Data columns (total 11 columns):

然后是列列表。多索引的第一部分应该是我对数据框进行分组的名称,然后是看起来是索引的名称。

我认为 apply 将每个组视为一个子数据框,然后我可以对其进行操作然后返回。我认为我对结构的理解存在缺陷,而且我很难找到任何可以帮助自己纠正的东西。

【问题讨论】:

  • 你想要的结果是什么?我猜“没有回答”和“超过 10 人”是您分组的值,而索引的另一部分(数字 67103 和 5617)是原始 DataFrame 的索引,现在已置换。这是它的正常工作方式:分组元素作为新的索引级别添加。你希望得到什么?
  • 运行此函数后,我希望能够重新访问每个子组并对其进行进一步分析。但我对结果格式很好奇。执行完 groupby 函数后,我可以使用 describe() 函数,它会返回一个按每个分组名称进行子索引的表以及统计信息。在我的应用函数之后,我想查看相同类型的表,但它会将其压缩为一个,其中行是描述参数,没有组索引级别
  • 我认为最后会发生一些对齐魔法(而不仅仅是连接),我经常发现 groupby 应用了一种黑暗艺术。
  • @mrdst:我还是不太明白你想做什么,但是如果你想对每个组“进行进一步分析”,你为什么不直接做 groupby 函数中的分析?也就是说,创建一个实际执行您想要完成的分析的函数,并将其与groupby(...).apply(...) 一起应用,因此它只返回您的分析结果。
  • 你试过transfrom而不是apply吗?

标签: python group-by pandas


【解决方案1】:

你可以使用 as_index=False:

df.groupby('size_of_business', as_index=False)

【讨论】:

  • 这并没有真正解决我的问题,输出结果是一样的。我最终得到了要在列表中分组的值,最后遍历列表并使用dataframe=df[df['size_of_business']==groups] 获取每个子帧,然后在子帧上调用函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2016-11-17
  • 1970-01-01
  • 2013-02-06
  • 2017-10-31
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多