从pandas中的列列表中创建新列

时间:2016-04-05 17:46:38

标签: python pandas

我有一个pandas数据框,其中有一列,其中的数据是从groupby操作计算出的统计信息列表。

df = pd.DataFrame({'a':[1,1,1,2,2,2,3], 'b':[3,4,2,3,4,3,2]}) 
def calculate_stuff(x):
    return len(x)/5, sum(x)/len(x), sum(x)
>>> df.groupby('a').apply(lambda row : calculate_stuff(row.b))
a
1               (0, 3, 9)
2               (0, 3, 10)
3               (0, 2, 2)
dtype: object

基本上,我有几个相互依赖的统计数据,必须为每个groupby行计算。执行此操作的函数返回统计值的元组。我想要的是为元组的每个索引创建一个新列,使它看起来像这样:

a    col1    col2    col3
1    0       3       9
2    0       3       10
3    0       2       2

我认为我不能使用df.groupby('a').agg,因为其他计算需要进行其中一项计算。有什么建议吗?

编辑:我意识到我的例子中的聚合函数不是聚合函数,所以我改了它们

2 个答案:

答案 0 :(得分:2)

添加额外的a类别项目,结果为4x3。

df = pd.DataFrame({'a': [1, 1, 1, 2, 2, 2, 3, 4], 
                   'b': [3, 4, 2, 3, 4, 3, 2, 1]})

new_cols = ['col1', 'col2', 'col3']

gb = df.groupby('a').apply(lambda group: calculate_stuff(group.b))

>>> pd.DataFrame(zip(*gb), columns=gb.index, index=new_cols).T
   col1  col2  col3
a                  
1     0     3     9
2     0     3    10
3     0     2     2
4     0     1     1

答案 1 :(得分:1)

您可以尝试list理解:

import pandas as pd

df = pd.DataFrame({'a':[1,1,1,2,2,2,3], 'b':[3,4,2,3,4,3,2]}) 

def calculate_stuff(x):
    return len(x)/5, sum(x)/len(x), sum(x)

group_df = df.groupby('a').apply(lambda row : calculate_stuff(row.b))

print pd.DataFrame([x for x in group_df], 
                    columns=['col1','col2','col3'], 
                    index=group_df.index)

   col1  col2  col3
a                  
1     0     3     9
2     0     3    10
3     0     2     2