【问题标题】:How do I create a new column of max values of a column(corresponding to specific name) using pandas?如何使用熊猫创建一个新列的最大值列(对应于特定名称)?
【发布时间】:2022-06-20 06:46:54
【问题描述】:

我想知道是否可以使用 Pandas 为一列的最大值创建一个新列(对应不同的名称,以便每个名称都有一个最大值)。

举个例子:

name    value    max
Alice    1        9
Linda    1        1
Ben      3        5
Alice    4        9
Alice    9        9
Ben      5        5
Linda    1        1

所以对于 Alice,我们选择 1、4 和 9 中的最大值,即 9。对于 Linda max(1,1) = 1,对于 Ben max(3,5) = 5。

我正在考虑使用.loc 选择name == "Alice",然后获取这些行的最大值,然后创建新列。但由于我正在处理一个大型数据集,这似乎不是一个好的选择。有没有更聪明的方法来做到这一点,这样我就不需要知道具体的名字了?

【问题讨论】:

    标签: python pandas csv max pandas-loc


    【解决方案1】:

    groupby 并取一个最大值按名称给出最大值,然后将其与原始 df 合并

    df.merge(df.groupby(['name'])['value'].max().reset_index(), 
             on='name').rename(
                        columns={'value_x' : 'value', 
                                 'value_y' : 'max'})
    
        name    value   max
    0   Alice   1   9
    1   Alice   4   9
    2   Alice   9   9
    3   Linda   1   1
    4   Linda   1   1
    5   Ben     3   5
    6   Ben     5   5
    

    【讨论】:

    • 为什么要使用合并?
    • 与 df 合并,每个名称都有最大值。对于每次出现的名称,所需的输出都需要一个最大值。因此,对于 Alice 的三行中的每一行,其值为 1、4 和 9,应为 9。
    • 谢谢,'value_x'和'value_y'是内置的吗?另外,我尝试了 df['max'] = df.groupby(['name'])['value'].max(),并且 max 列都有 nan 值,不知道为什么。我必须使用合并吗?
    • 另一个非常相似的:df.merge(df.groupby('name').max(), on='name', suffixes=('', 'x')).rename(columns={'valuex': 'max'})
    • 嗨@Nan,我在后续编辑中重命名了这些列。当两个 DF 合并并具有共同名称时,可以选择为其添加后缀,默认为合并中的左右 df 分别添加 _x 和 _y。
    【解决方案2】:

    您可以使用transformmap

    df['max'] = df.groupby('name')['value'].transform('max')
    

    df['max'] = df['name'].map(df.groupby('name')['value'].max())
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2021-09-29
      • 2023-02-09
      • 2013-04-20
      • 2017-09-05
      • 2021-06-25
      相关资源
      最近更新 更多