【问题标题】:Python Pandas max value in a group as a new column一组中的 Python Pandas 最大值作为新列
【发布时间】:2016-06-08 23:57:44
【问题描述】:

我正在尝试计算一个新列,其中包含几个组中的每一个的最大值。我来自 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 用于每个组。

【问题讨论】:

    标签: python pandas dataframe grouping pandas-groupby


    【解决方案1】:

    使用上面 jpp 的方法可以工作,但它也给出了“SettingWithCopyWarning”。虽然这可能不是问题,但我相信下面的代码会删除该警告:

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

    【讨论】:

    • 小心,您将 NumPy 数组(数据帧的values 属性)分配给df。我不认为那是你想要的。
    • 我不得不再次将 NumPy 数组转换为 DF。不过,这是一个更快的解决方案。
    【解决方案2】:

    使用groupby + transform:

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

    这相当于verbose:

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

    transform 方法将groupby 结果与groupby 索引器对齐,因此不需要显式映射。

    【讨论】:

      【解决方案3】:
      df['max'] = df.group_col.map(lambda x: df.groupby('group_col').odds.max()[x])
      

      【讨论】:

      • 如果你能解释一下你的答案会更好。 SO 上只接受代码。
      • lambda 函数对 group_col 进行 groupby 并返回每组中赔率列的最大值。这些返回值的索引是它们所属的组的名称。因此,对于 group_col 中的每个元素,我们通过 (lambda x (组名): groupby_returns_max_values [x]) 映射适当的最大值。
      • 这里不需要lambda 函数;您可以直接使用系列映射。但是,最好使用groupby + transform(如另一个答案所示)。
      • @jpp 的答案对于大型数据帧来说要快得多
      猜你喜欢
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 2022-11-12
      • 2023-02-07
      相关资源
      最近更新 更多