在pandas.DataFrame.groupby.apply()之后重命名列

时间:2016-04-27 03:37:03

标签: python pandas

我需要将scipy.stats应用于按列分组的pandas DataFrame。我希望能够在结果DataFrame中保留列的名称。这是我到目前为止所拥有的。

从一些随机数据开始进行演示。

df = pd.DataFrame(np.random.randn(10, 5),
           columns=['a', 'b', 'c', 'd', 'e'])
df['category'] = pd.Series(["1","2","3","1","1","3","2","3","1","2"])
df.head()

输出:

    a           b           c           d           e         category
0   -0.384575   -1.722937   0.868886    -1.843398   -1.659861   1
1   1.170742    -2.732823   0.974790    -0.167318   0.399720    2
2   -0.330587   -0.214645   -0.196441   0.768405    1.256272    3
3   0.961955    -0.270461   -0.226601   1.911941    -0.595420   1
4   0.596214    0.122938    2.420786    0.113196    0.734691    1

以下是我想要的示例,使用sum()函数:

grouped = df.groupby('category')
grouped.sum()

输出:

    a           b           c           d           e
category                    
1   -0.246350   -0.973571   4.525511    2.690969    -2.216404
2   2.238123    -3.794821   -0.457655   -1.248493   -0.342675
3   -1.049097   1.359168    1.125174    0.659131    2.139560

请注意,列具有正确的标签。现在出现问题:

grouped.apply(kurtosis)

输出:

category
1    [-1.40177576836, -1.02037807436, -1.1792712163...
2                       [-1.5, -1.5, -1.5, -1.5, -1.5]
3                       [-1.5, -1.5, -1.5, -1.5, -1.5]
dtype: object

请注意,这不再是DataFrame,也没有列名。所以我试着变得聪明,并输出一个具有指定名称的系列 - 但它不起作用:

grouped.apply(lambda x: pd.Series(kurtosis(x), name=x.name))

输出:

     0          1           2           3           4
category                    
1   -1.401776   -1.020378   -1.179271   -1.384131   -0.984184
2   -1.500000   -1.500000   -1.500000   -1.500000   -1.500000
3   -1.500000   -1.500000   -1.500000   -1.500000   -1.500000

有什么想法吗?我错过了什么?

1 个答案:

答案 0 :(得分:2)

不确定为什么会发生这种情况(我提出了TypeError但是你可以使用agg

df.groupby("category").agg(kurtosis)
Out[16]: 
                a         b         c         d         e
category                                                 
1        -1.18953 -1.013635 -1.756748 -1.167473 -1.271358
2        -1.50000 -1.500000 -1.500000 -1.500000 -1.500000
3        -1.50000 -1.500000 -1.500000 -1.500000 -1.500000