【问题标题】:Pandas: idiomatic way to perform multiple complex aggregations?Pandas:执行多个复杂聚合的惯用方式?
【发布时间】:2020-08-10 06:42:21
【问题描述】:

我有一张如下表:

ID   SCORE
A    NaN
A    NaN
B    1
B    2
C    5

我想要以下输出:

ID    SUM_SCORE   SIZE_SCORE
A     NaN         2
B     3           2
C     5           1

由于我想保留 NaN,我需要使用 sum(min_count=1)。所以到目前为止我有以下几点:

grp = df.groupby('ID')
sum_score = grp['SCORE'].sum(min_count=1).reset_index()
size_score = grp['SCORE'].size().reset_index()
result = pd.merge(sum_score, size_score, on=['ID'])

这感觉真的很不雅。有没有更好的方法来获得我正在寻找的结果?

【问题讨论】:

    标签: python pandas aggregation


    【解决方案1】:
    s=df.groupby('ID').SCORE.agg([('sum_score',lambda x : x.sum(min_count=1)),
                                 ('size_score','size')] ).reset_index()
      ID  sum_score  size_score
    0  A        NaN           2
    1  B        3.0           2
    2  C        5.0           1
    

    【讨论】:

    • IIUC 是什么意思?
    • 只是好奇,我的数据集需要大约 7 秒。分别计算它们需要 0.046 秒。知道为什么吗?
    • @AlexanderDavid 我不确定,如果您想加快速度,请分开然后加入
    【解决方案2】:

    您可以使用以下方法进行汇总:

    df_agg = df.groupby("ID", as_index=False).agg(["sum","count"])
    
    # rename your columns
    df_agg.columns = ["ID","SUM_SCORE", "SIZE_SCORE"]
    

    【讨论】:

    • 这不会保留 NaN,因为 pandas 中的 sum([NaN, NaN]) 默认为 0,请参见此处:github.com/pandas-dev/pandas/issues/15674
    • 啊,明白了。那很有意思。 ^上面的答案看起来不错。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2014-10-21
    • 2019-11-04
    相关资源
    最近更新 更多