【问题标题】:Maximum value for a particular ID特定 ID 的最大值
【发布时间】:2021-10-27 00:14:14
【问题描述】:

我有一个数据框:

df = pd.DataFrame({"id": [1,1,1,2,2,2,3,3,3], "elev": [10,11,2,45,5,4,4,4,9], "year": [2009,2010,2010,2009,2010,2011,2006,2007,2007]})

id  elev   year
1    10    2009
1    11    2010
1    2     2010
2    45    2009
2     5    2010
2     4    2011
3     4    2006
3     4    2007
3     9    2007

我只想保留每个 ID 的最大年份行数:

id  elev   year
1     11    2010
1     2     2010
2     4     2011
3     4     2007
3     9     2007

我尝试了以下代码:

df = df.groupby("id")

df = df.max('year')
df = df.reset_index()

但它只为每个 ID 保留一行。

【问题讨论】:

    标签: pandas dataframe group-by


    【解决方案1】:

    您需要创建一个布尔值来过滤原始数据框;这可以通过转换实现:

    In [164]: df.loc[df.year.eq(df.groupby('id').year.transform('max'))]
    Out[164]: 
       id  elev  year
    1   1    11  2010
    2   1     2  2010
    5   2     4  2011
    7   3     4  2007
    8   3     9  2007
    

    细分:这会为每个 ID 生成最大值,并附加到每个相关索引。

    In [165]: df.groupby('id').year.transform('max')
    Out[165]: 
    0    2010
    1    2010
    2    2010
    3    2011
    4    2011
    5    2011
    6    2007
    7    2007
    8    2007
    Name: year, dtype: int64
    

    Step2:将年份与最大值进行比较

    df.year.eq(df.groupby('id').year.transform('max'))
    
    0    False
    1     True
    2     True
    3    False
    4    False
    5     True
    6    False
    7     True
    8     True
    Name: year, dtype: bool
    

    第三步:索引

    In [164]: df.loc[df.year.eq(df.groupby('id').year.transform('max'))]
    Out[164]: 
       id  elev  year
    1   1    11  2010
    2   1     2  2010
    5   2     4  2011
    7   3     4  2007
    8   3     9  2007
    

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多