熊猫在多轴上的操作

时间:2018-02-14 00:15:59

标签: pandas

如何在pandas中一次性对多个列进行操作?

例如,我想计算df[['a',b']].mean(level=0)df[['a',b']].kurtosis(level=0)(我需要等级= 0,因为它是一个多索引数据框)。

但是我希望有一个单一的数字,一次性在多个轴上进行计算。 A和B将合并为一个单独的列(或系列)。

在numpy中我可以相信axis=(0,1),但我不确定如何在熊猫中实现这一目标。

速度非常重要,因此应用或迭代不是解决方案。

预期结果如下:

np.random.seed([3, 1415])
df = pd.DataFrame(
    np.random.rand(10, 2),
    pd.MultiIndex.from_product([list('ab'), range(5)]),
    list('AB')
)
df
Out[76]: 
            A         B
a 0  0.444939  0.407554
  1  0.460148  0.465239
  2  0.462691  0.016545
  3  0.850445  0.817744
  4  0.777962  0.757983
b 0  0.934829  0.831104
  1  0.879891  0.926879
  2  0.721535  0.117642
  3  0.145906  0.199844
  4  0.437564  0.100702

预期结果:

df.groupby(level=0).agg(['mean']).mean(axis=1)
Out[78]: 
a    0.546125
b    0.529589
dtype: float64

但它需要在一次计算中实现,而不是平均值,因为这可能适用于均值,但对于其他计算,它可能不会产生与一次性完成相同的结果(对于例如,我不确定峰度的峰度是否一次等于峰度。)

2 个答案:

答案 0 :(得分:1)

考虑示例数据框df

np.random.seed([3, 1415])
df = pd.DataFrame(
    np.random.rand(10, 2),
    pd.MultiIndex.from_product([list('ab'), range(5)]),
    list('AB')
)
df

            A         B
a 0  0.444939  0.407554
  1  0.460148  0.465239
  2  0.462691  0.016545
  3  0.850445  0.817744
  4  0.777962  0.757983
b 0  0.934829  0.831104
  1  0.879891  0.926879
  2  0.721535  0.117642
  3  0.145906  0.199844
  4  0.437564  0.100702

典型解决方案

使用groupbyagg

df.groupby(level=0).agg(['mean', pd.Series.kurt])

          A                   B          
       mean      kurt      mean      kurt
a  0.599237 -2.885262  0.493013  0.018225
b  0.623945 -0.900488  0.435234 -3.105328

解决不同

pd.concat([
    df.mean(level=0),
    df.kurt(level=0)
], axis=1, keys=['Mean', 'Kurt']).swaplevel(1, 0, 1).sort_index(1)

          A                   B          
       Kurt      Mean      Kurt      Mean
a -2.885262  0.599237  0.018225  0.493013
b -0.900488  0.623945 -3.105328  0.435234

答案 1 :(得分:-1)

这似乎有效:

df.stack().mean(level=0)

Out[146]: 
a    0.546125
b    0.529589
dtype: float64