Python Pandas 将分组中的最大值作为新列

28

我正在尝试计算一个包含每个组的最大值的新列。我来自Stata背景,所以我知道Stata代码应该是这样的:

by group, sort: egen max = max(odds) 

例如:

data = {'group' : ['A', 'A', 'B','B'],
    'odds' : [85, 75, 60, 65]}

那么我希望它看起来像这样:

    group    odds    max
     A        85      85
     A        75      85
     B        60      65
     B        65      65

最终我试图形成一个列,其中采用 1/(max-min) * odds 的公式,其中 maxmin 对于每个组都是不同的。

3个回答

45

使用groupbytransform方法:

df['max'] = df.groupby('group')['odds'].transform('max')

这相当于冗长的写法:
maxima = df.groupby('group')['odds'].max()
df['max'] = df['group'].map(maxima)
transform 方法会将 groupby 的结果与 groupby 索引器对齐,因此不需要显式映射。

4

使用上述jpp的方法是可行的,但它也会产生“SettingWithCopyWarning”警告。尽管这可能不是问题,但我认为下面的代码将消除该警告:

df = df.assign(max = df.groupby('group')['odds'].transform('max')).values

1
小心,你正在将NumPy数组(数据框的“values”属性)分配给“df”。我认为这不是你想要的。 - jpp
我不得不再次将NumPy数组转换为DF。不过,这是一个更快的解决方案。 - Jinto Lonappan

0
df['max'] = df.group_col.map(lambda x: df.groupby('group_col').odds.max()[x])

2
如果您能稍微解释一下您的答案,那将更好。在SO上,仅有代码是不可接受的。 - Adnan Umer
Lambda函数对group_col进行分组,并返回每个组中odds列的最大值。这些返回值的索引是它们所属的组的名称。因此,对于group_col中的每个元素,我们通过执行(lambda x(组名):groupby_returns_max_values [x])映射相应的最大值。 - toniitony
这里不需要使用 lambda 函数;你可以直接使用一系列映射。但更好的方法是使用 groupby + transform(如另一个答案所示)。 - jpp
2
@jpp的答案对于大型数据框来说速度更快。 - nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接