2017-02-10 115 views
1

高清my_per_group_func(临时):如何将groupby-apply-aggregate返回到Python Pandas中的数据框?

# apply some tricks here 
    return a, b, c, d 

output = dataframe.groupby('group_id').apply(my_per_group_func) 

我的问题这里如何聚合“输出”回一些列名(显然数据帧的指数是GROUP_ID)一个数据帧?

通常我做的是使用聚合函数

但这里的问题是,my_per_group_func非常这里复杂的,它不能用正常的“聚合”功能语法

没有任何人有做线索?

感谢

回答

0
dataframe['new column name'] = dataframe.groupby('group_id').transform(my_per_group_func) 
+2

也许你可以提供关于你的答案有些情况下,为什么这会解决问题? – sadmicrowave

0

似乎需要返回DataFrameSeries - 检查flexible apply docs

dataframe = pd.DataFrame({'group_id':[1,1,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (dataframe) 
    B C D E F group_id 
0 4 7 1 5 7   1 
1 5 8 3 3 4   1 
2 6 9 5 6 3   3 

def my_per_group_func(x): 
    #print (x) 
    #some sample operations 
    a = x.B + x.C 
    b = x.E + x.B 
    c = x.D + x.F 
    d = x.F + x.E 
    return pd.DataFrame({'group_id': x.group_id, 'a':a, 'b':b, 'c':c, 'd':d}) 

output = dataframe.groupby('group_id').apply(my_per_group_func) 
print (output) 
    a b c d group_id 
0 11 9 8 12   1 
1 13 8 7 7   1 
2 15 12 8 9   3 

def my_per_group_func(x): 
    #print (x) 
    #some sample aggregations 
    a = (x.B + x.C).mean() 
    b = (x.E + x.B).sum() 
    c = (x.D + x.F).median() 
    d = (x.F + x.E).std() 
    return pd.Series([a,b,c,d], index=['a','b','c','d']) 

output = dataframe.groupby('group_id').apply(my_per_group_func) 
print (output) 
      a  b c   d 
group_id       
1   12.0 17.0 7.5 3.535534 
3   15.0 12.0 8.0  NaN 
相关问题