【问题标题】:How to agg with condition in lambda after groupby如何在 groupby 之后在 lambda 中使用条件进行聚合
【发布时间】:2020-01-07 03:48:27
【问题描述】:

groupby 之后,我想agglambda 有条件, 只选择'product1_Gift0' == 1

但似乎无法得到答案

需要'保证金'计算的指导,而不是计算全部,仅在'product1_Gift0' equal '1'时计算

data = [['john', 'A01', 0, 0.0],['john', 'A01', 1, 1.0],['john', 'A01', 1, 0.5],['jess', 'B01', 0, 0.0],['jess', 'B01', 0, 0.0],['jess', 'B01', 1, 0.8]]


df2 = pd.DataFrame(data, columns = ['member', 'orderID','product1_Gift0','margin']) 

df3 = df2.groupby('member').agg({
                                 'product1_Gift0': lambda x: sum(x)/len(x),
                                 'margin' : lambda x: sum(x)/len(x),
                              })

actual_result = [['john', 'A01', 0.3333, 0.50],
                 ['john', 'A01', 0.6667, 0.27]]

expected_result = [['john', 'A01', 0.3333, 0.75],
                   ['john', 'A01', 0.6667, 0.80]]

谢谢

【问题讨论】:

    标签: python lambda group-by aggregate


    【解决方案1】:

    试试这个:

    >>> df2.groupby('member').apply(lambda x: pd.Series({"product_Gift0_mean": x.product1_Gift0.mean(), "margin_mean": sum(x.margin * (x.product1_Gift0==1))/(x.product1_Gift0==1).sum()}))
            margin_mean  product_Gift0_mean
    member
    jess           0.80            0.333333
    john           0.75            0.666667
    
    
    

    【讨论】:

    • 谢谢!题外话,你能不能指出你使用的资源,当你试图掌握对 lambda 的理解时
    • Lambda 函数只是应用于您正在获取的任何输入的函数(因此 lambda 函数参数是一个输入)。您可以尝试 W3 Schools 的基础知识:w3schools.com/python/python_lambda.asp,以及 apply 本身的文档:pandas.pydata.org/pandas-docs/version/0.23/generated/…
    • 我试图理解你的逻辑。您的答案是将答案分成“0”、“1”列。我可以知道如何实现“预期结果”,其中答案是通过“agg”函数单线形成的。我可以分几次完成,加入 df 和重命名。只是想知道你是如何在单线中实现它的。谢谢
    • @Jonathan 请更新。现在我使用 apply 而不是 agg,因为:stackoverflow.com/a/21831599/11610186。 Apply 只是与整个数据集交互 - 所以我可以在列之间建立相互依赖关系 - 这是你想要的(据我所知)。
    猜你喜欢
    • 2023-01-23
    • 2020-04-29
    • 2021-11-13
    • 2021-11-24
    • 1970-01-01
    • 2016-03-16
    • 2019-10-22
    • 2020-07-01
    • 2020-07-04
    相关资源
    最近更新 更多