分配在分组 pandas 数据框中不起作用

assign not working in grouped pandas dataframe

在使用 pandas 的复杂链式方法中,其中一个步骤是按列对数据进行分组,然后计算一些指标。这是我想要实现的程序的简化示例。我在工作流程中有更多的任务,但一开始就失败了。

import pandas as pd
import numpy as np

data = pd.DataFrame({'Group':['A','A','A','B','B','B'],'first':[1,12,4,5,4,3],'last':[5,3,4,5,2,7,]})

data.groupby('Group').assign(average_ratio=lambda x: np.mean(x['first']/x['last']))


>>>> AttributeError: 'DataFrameGroupBy' object has no attribute 'assign'

我知道我可以用这种方式申请:

data.groupby('Group').apply(lambda x: np.mean(x['first']/x['last']))
Group
A    1.733333
B    1.142857
dtype: float64

或者更好,在同一步骤中重命名该列:

data.groupby('Group').apply(lambda x: pd.Series({'average_ratio':np.mean(x['first']/x['last'])}))

average_ratio
Group   
A   1.733333
B   1.142857

有什么方法可以使用 .assign 来获得相同的东西吗?

回答最后一个问题,根据您的需要,不可以。该方法 DataFrame.assign 只是添加新列或替换现有列,但 return 具有 new/adjusted 列的相同索引 DataFrame

您正在尝试进行分组聚合,将行减少到组级别,从而将索引和 DataFrame 粒度从单元级别更改为聚合分组级别。因此你需要 运行 你的 groupby 操作没有 assign.

要封装与链式流程对齐的多个分配的聚合列,请使用已定义的方法,然后 apply 相应地使用它:

def aggfunc(row): 
    row['first_mean'] = np.mean(row['first']) 
    row['last_mean'] = np.mean(row['last']) 
    row['average_ratio'] = np.mean(row['first'].div(row['last'])) 

    return row


agg_data = data.groupby('Group').apply(aggfunc)