分配在分组 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)
在使用 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)