Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将用户定义的函数应用于中Group By的每个子组_Python_Group By_Pandas - Fatal编程技术网

Python 将用户定义的函数应用于中Group By的每个子组

Python 将用户定义的函数应用于中Group By的每个子组,python,group-by,pandas,Python,Group By,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

我现在和熊猫一起工作了一段时间,但我真的在团队中按功能来划分

我定义了以下函数,它最终对新列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中,然后对其运行一些统计数据

我现在要做的是在dataframe上运行一个group by函数,通过其他列之一对它们进行分组,并对子组执行此分析。我试着

df.groupby('size_of_business').apply(get_rfm)
但结果并不是我所期望的。返回的数据帧似乎是多索引的

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

多重索引:57196条,(未回答,67103条)至(超过10人,5617条)
数据列(共11列):
然后是列列表。多重索引的第一部分应该是我对数据帧分组时使用的名称,然后是看起来像索引的名称


我认为apply将每个组视为一个子数据帧,然后我可以对其进行操作并返回。我相信我对这个结构的理解是有缺陷的,我很难找到任何有助于纠正我自己的东西。

你可以使用as_index=False:

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

你希望结果是什么?我猜“没有回答”和“超过10个人”是您分组的值,索引的另一部分(数字67103和5617)是原始数据帧的索引,现在已排列。这是它的正常工作方式:grouped by元素被添加为一个新的索引级别。您希望得到什么?运行此函数后,我希望能够重新访问每个子组并对其进行进一步分析。但我对结果的格式很好奇。在执行groupby函数后,我可以使用descripe()函数,它将返回一个表,该表按每个分组名称进行子索引,并包含统计信息。在我的apply函数之后,我想看看相同类型的表,但它将表压缩为一个,行是描述参数,没有组索引级别。我认为在最后会发生一些对齐魔术(而不仅仅是concat),我经常发现groupby应用了一种黑暗的艺术。@mrdst:我仍然不太明白您想做什么,但是如果您想对每个组“执行进一步的分析”,为什么不在groupby函数中进行分析呢?也就是说,创建一个实际执行您想要执行的分析的函数,并使用
groupby(…).apply(…)
,这样它只返回您的分析结果。您是否尝试过transfrom而不是apply?这并没有真正解决我的问题,输出结果是相同的。最后,我在一个列表中获取了分组依据的值,并在列表上进行迭代,并使用
dataframe=df[df['size\u of_business']==groups]
获取每个子帧,然后调用子帧上的函数。