如何在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
但它需要在一次计算中实现,而不是平均值,因为这可能适用于均值,但对于其他计算,它可能不会产生与一次性完成相同的结果(对于例如,我不确定峰度的峰度是否一次等于峰度。)
答案 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
典型解决方案
使用groupby
和agg
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