【问题标题】:Summing the three largest elements in each group in a dataframe将数据框中每组中的三个最大元素相加
【发布时间】:2020-12-06 02:39:52
【问题描述】:

我已经学习了 2 周的 pandas 数据框。一开始,一切都很顺利,但现在我陷入了以下多操作练习:我得到了数据框:

df = pd.DataFrame({
    'Mountain Range': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'], 
    'Peak': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's'], 
    'Height above sea level': [2340, 3050, 4220, 2675, 2980, 3300, 3405, 3410, 2970, 2840, 2780, 3140, 3210, 2885, 3000, 3110, 2640, 2635]
    })

我需要创建一个函数来返回最高山脉的名称(“A”、“B”、“C”或“D”),仅查看山脉中存在的三个最高峰。我尝试过groupby、nlargest、sort_values、sum的组合,但都失败了。

我试过了-

df.set_index(['Mountain Range']).nlargest(3, 'Height above sea level').idxmax() 

df.groupby(['Mountain Range'])['Height above sea level'].sum().sort_values(ascending=False) 

df.groupby(['Mountain Range']).nlargest(3, 'Height above sea level).sum()

我不知道如何将 nlargest 或 sum 分别应用于每个组(山脉),而不是整个数据帧

【问题讨论】:

  • 我不明白这与获得最高峰的山脉有何不同。
  • 可能我说的不够清楚——看三个最高峰,就是根据三个最高峰的高度之和。
  • 请展示你做了什么。你提到的一些功能是一个有效的解决方案,很可能你是在正确的轨道上
  • 另外,请具体说明您的标题,例如“将每组中最大的三个元素相加”。 “复杂”不适用。
  • 感谢您的回复。我修改了帖子标题。我试过了:

标签: python pandas


【解决方案1】:

我认为你可以这样做:

(df.sort_values('Height above sea level', ascending=False)
  .groupby('Mountain Range')['Height above sea level'].nlargest(3)
  .sum(level=0).idxmax())

输出:

'A'

如何?

  • sort_values 使用海拔高度下降的数据框
  • groupby Mountain Range 并从每组中获得 3 个 nlargest
  • sum 使用 level=0 按山脉对这些值求和
  • 使用idxmax获取最大的索引/山脉 总和

【讨论】:

  • 谢谢@Scott Boston。你的代码解决了我的问题!它的第一部分(sort_values,然后是 groupby 并指出适当的列)是问题的关键。我检查了当 groupby 中缺少 ['Height above sea level'] 时,代码不起作用,这对我来说并不完全清楚。我将非常感谢一些解释
  • @michael11 我不明白你的问题。如果缺少“海拔高度”,则 nlargest 对前三名的记录没有任何价值。您可以用零填充这些缺失值,然后使用相同的语句。
【解决方案2】:

你可以简单地做到这一点 -

g = df.groupby('Mountain Range')['Height above sea level'].apply(lambda x: np.sum(x.nlargest(3))).reset_index()
print(g)
#get the sum of top 3 peaks heights grouped by Mountain Range
  Mountain Range  Height above sea level
0              A                   10250
1              B                   10115
2              C                    9235
3              D                    8750

接下来,根据高度获取顶部山脉

g.nlargest(1, 'Height above sea level')['Mountain Range'][0]
'A'

【讨论】:

    【解决方案3】:
    import pandas as  pd
    
    df = pd.DataFrame({
        'Mountain Range': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'], 
        'Peak': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's'], 
        'Height above sea level': [2340, 3050, 4220, 2675, 2980, 3300, 3405, 3410, 2970, 2840, 2780, 3140, 3210, 2885, 3000, 3110, 2640, 2635]
        })
    
    df = df.sort_values(by=['Height above sea level'])
    print(df.drop_duplicates(subset=['Mountain Range'], keep='last'))
    

    输出

    Mountain Range Peak  Height above sea level
    15              D    p                    3110
    12              C    m                    3210
    7               B    h                    3410
    2               A    c                    4220
            
        
    

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 2012-11-09
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多