Python groupby之后用于聚合的列的组合 问题:

Python groupby之后用于聚合的列的组合 问题:,python,pandas,aggregate,pandas-groupby,Python,Pandas,Aggregate,Pandas Groupby,寻找类似于 df.groubpy('key').aggregate(combination(columnA, columnB)) 而不是 df['combination'] = combination(columnA, columnB) df.groupby('key')['combination'].aggregate() 唯一的要求是在groupby之后计算列的组合 描述 我似乎很自然,逻辑上很明智,在某些情况下,我会先分组,然后进行汇总 一个例子是使用相同组的不同列组合的不同聚合函数

寻找类似于

df.groubpy('key').aggregate(combination(columnA, columnB))
而不是

df['combination'] = combination(columnA, columnB)
df.groupby('key')['combination'].aggregate()
唯一的要求是在groupby之后计算列的组合


描述 我似乎很自然,逻辑上很明智,在某些情况下,我会先分组,然后进行汇总

一个例子是使用相同组的不同列组合的不同聚合函数

寻找

  • 群比
  • 选择列的组合
  • 使用相应的聚合函数
  • 而不是

    df['combination'] = combination(columnA, columnB)
    df.groupby('key')['combination'].aggregate()
    
  • 创建所有必要的列(对于每个聚合函数)
  • groupby(针对每个聚合函数)
  • 应用特定聚合函数

  • 例子
    好的,所以我认为您要寻找的答案是-我们不这样做,因为python中的矢量化

    考虑下面的代码

    从本质上讲,python通常经过优化,以向量化的方式执行某些数学运算(例如
    numpy
    pandas
    ),这意味着将其应用于整个向量比将其分解成块然后执行更快

    例如,
    df[“A”].mul(df[“B”])
    将比:
    df.apply(lambda X:X[“A”]*X[“B”],axis=0)更快。分组也是如此——那样的话,它的可伸缩性就更大了

    尝试下面的代码-本质上就是您所指的-在
    groupby(…)
    之前和之后执行操作。矢量化的解决方案扩展得相当快,即使您具体化了额外的列—处理的行越多,您将看到的差异就越大

    编辑

    我在分组数据上添加了矢量化解决方案,因此我们有:

    (1) 我们分组,一行一行地懒洋洋地评估

    (2) 我们以矢量化的方式处理完整的df,我们分组并应用内置的聚合功能

    (3) 我们分组,我们以向量化的方式分组处理,分组,我们做聚合功能

    本质上——从结果来看,我们看到分解成块会减慢处理速度,无论是每个组还是每个记录——因此矢量化解决方案比我们可以应用在顶部的任何自定义解决方案都具有更好的伸缩性

    将熊猫作为pd导入
    将numpy作为np导入
    导入时间
    x=np.random.randint(1,9,(3000,5))
    df=pd.DataFrame(x,columns=[f“column{l}”表示列表中的l(“ABCDE”)])
    df[“cat”]=np.random.choice([f“key{l}”表示列表中的l(“ABCDEFG”)],size=3000)
    df2=df3=df
    #打印(df)
    s=时间。时间()
    df.groupby(“cat”).apply(lambda z:np.prod(z.values,axis=1.mean()).pipe(print)
    e=时间。时间()-s
    打印(f“方法1:{e}s”)
    s=时间。时间()
    df2[“prod”]=np.prod(df[[f“column{l}”表示列表中的l(“ABCDE”)]],axis=1)
    df2.groupby(“cat”)[“prod”].mean().pipe(打印)
    e=时间。时间()-s
    打印(f“方法2:{e}s”)
    s=时间。时间()
    df3=list(map(lambda x:(x[0],np.prod(x[1][[f“column{l}”表示列表中的l(“ABCDE”)]),axis=1.mean(),df3.groupby(“cat”))
    打印(df3)
    e=时间。时间()-s
    打印(f“方法3:{e}s”)
    
    我不确定我是否理解其中的区别。他们应该给出相同的答案,不管你是在小组之前还是在小组内部。唯一的主要区别是后者的效率非常低,因为它返回到一个缓慢的python循环,而前者有一个快速的cython循环implementation@anky_91这是一个由两列组成的函数,在我所知道的情况下,它只提供一个输出。对于答案,它可以被替换。@ALollz是的,它们是等价的。区别在于你表达和使用它的方式。我在看熊猫身上是否有什么东西。很好的答案!非常感谢你。在我看来,不使用像apply这样慢的东西也能达到同样的效果是合乎逻辑的。事实上,它只是在groupby对象中选择一些列以及它们之间的操作。我的意思是,在拆分操作之后,组合列也可以使用矢量化的方式。但似乎没有办法做到这一点?我添加了这个概念——请纠正我,如果你认为这可以做得更好的话——这将是我对分解成块并以矢量化方式逐个处理它们的看法。