Pandas为列创建自定义groupby聚合

时间:2018-04-09 21:07:10

标签: python pandas

在Pandas中是否有办法创建一个新列,它是两列聚合的函数,因此对于任何任意分组,它都会保留该函数?这在功能上类似于在Excel中创建计算列并按标签旋转。

df1 = pd.DataFrame({'lab':['lab1','lab2']*5,'A':[1,2]*5,'B':[4,5]*5})
df1['C'] = df1.apply(lambda x: x['A']/x['B'],axis=1)
pd.pivot_table(df1,index='lab',{'A':sum,'B':sum,'C':lambda x: x['A']/x['B']})

应该返回: |lab|A B|C| |----|---|---| |lab1|5 |20|.25| |lab2|10|25 |.4|

我希望通过“实验室”进行汇总。 (或标签的任何组合)并使数据帧返回聚合而不必重新定义列计算。我意识到这对于手动编码来说是微不足道的,但是当你有很多列时,它是重复的。

1 个答案:

答案 0 :(得分:2)

使用applyagg

可以通过两种方式执行此操作
import numpy as np
import pandas as pd

# Method 1
df1.groupby('lab').apply(lambda df: pd.Series({'A': df['A'].sum(), 'B': df['B'].sum(), 'C': df['C'].unique()[0]})).reset_index()

# Method 2
df1.groupby('lab').agg({'A': 'sum',
                    'B': 'sum',
                    'C': lambda x: np.unique(x)}).reset_index()

# output
     lab  A    B   C
0   lab1  5    20 0.25
1   lab2  10   25 0.40