【问题标题】:How to aggregate two largest values per group in pandas?如何在熊猫中聚合每组的两个最大值?
【发布时间】:2019-10-11 16:28:22
【问题描述】:

我正在浏览这个链接:Return top N largest values per group using pandas

并找到了多种方法来查找每组的前 N ​​个值。

但是,我更喜欢带有 agg 函数的字典方法,并且想知道是否有可能获得与以下问题的字典方法等效的方法?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1,   1,   1,   2,   2],
                   'B': [1,   1,   2,   2,   1],
                   'C': [10,  20,  30,  40,  50],
                   'D': ['X', 'Y', 'X', 'Y', 'Y']})
print(df)
   A  B   C  D
0  1  1  10  X
1  1  1  20  Y
2  1  2  30  X
3  2  2  40  Y
4  2  1  50  Y

我可以这样做:

df1 = df.groupby(['A'])['C'].nlargest(2).droplevel(-1).reset_index()
print(df1)
   A   C
0  1  30
1  1  20
2  2  50
3  2  40

# also this
df1 = df.sort_values('C', ascending=False).groupby('A', sort=False).head(2)
print(df1)

# also this
df.set_index('C').groupby('A')['B'].nlargest(2).reset_index()

必填

df.groupby('A',as_index=False).agg(
    {'C': lambda ser: ser.nlargest(2)  # something like this
    })

这里可以用字典吗?

【问题讨论】:

  • 你想使用字典方法本身的原因是什么?
  • @Erfan,保持一致并使用 agg.{dict} 用于所有 groupby 案例。 Pandas 有很多方法可以做同样的操作,坚持一种范式并尽可能在任何地方都遵循它是一个好习惯。 (例如,用 groupby 替换所有使用的 pivot、pivot table、melt 等,并且只在任何地方使用 groupby。)
  • 老实说这没有任何意义,您应该为正确的用例使用正确的方法。不要对每种情况使用一种方法,因为它是“一致的”。
  • @Erfan 我部分同意你的看法。 groupby.agg(dict) 看起来更易于阅读且跨平台(例如,在 PySpark 和 R 中类似)。我正在探索只使用一种方法来完成所有事情的方法。很难记住这么多方法。很高兴知道许多替代方案,但坚持一个。
  • @ALollz 我曾经使用Series.groupby().agg(dict) 进行重命名,例如{'minimal':'min', 'total':'sum'}。但是**kwargs 是现在的方式。

标签: python pandas


【解决方案1】:

如果你想得到像 A: 2 top values from C 这样的字典, 你可以运行:

df.groupby(['A'])['C'].apply(lambda x:
    x.nlargest(2).tolist()).to_dict()

对于您的 DataFrame,结果是:

{1: [30, 20], 2: [50, 40]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2019-01-16
    • 2021-06-21
    • 1970-01-01
    • 2019-10-21
    • 2017-01-14
    • 2013-04-20
    • 2022-11-28
    相关资源
    最近更新 更多