多个数据框架的逐元素平均值和标准差

6

数据: 多个格式相同的数据帧(列相同,行数相等,没有缺失点)。

如何创建一个“摘要”数据帧,其中包含每个元素的逐元素平均值?如何创建一个包含逐元素标准差的数据帧?

          A         B         C
0 -1.624722 -1.160731  0.016726
1 -1.565694  0.989333  1.040820
2 -0.484945  0.718596 -0.180779
3  0.388798 -0.997036  1.211787
4 -0.249211  1.604280 -1.100980
5  0.062425  0.925813 -1.810696
6  0.793244 -1.860442 -1.196797

          A         B         C
0  1.016386  1.766780  0.648333
1 -1.101329 -1.021171  0.830281
2 -1.133889 -2.793579  0.839298
3  1.134425  0.611480 -1.482724
4 -0.066601 -2.123353  1.136564
5 -0.167580 -0.991550  0.660508
6  0.528789 -0.483008  1.472787

请您提供几个数据框的样本吗? - alacy
A B C 0 -1.624722 -1.160731 0.016726 1 -1.565694 0.989333 1.040820 2 -0.484945 0.718596 -0.180779 3 0.388798 -0.997036 1.211787 4 -0.249211 1.604280 -1.100980 5 0.062425 0.925813 -1.810696 6 0.793244 -1.860442 -1.196797 A B C0 1.016386 1.766780 0.648333 1 -1.101329 -1.021171 0.830281 2 -1.133889 -2.793579 0.839298 3 1.134425 0.611480 -1.482724 4 -0.066601 -2.123353 1.136564 5 -0.167580 -0.991550 0.660508 6 0.528789 -0.483008 1.472787 - Alealeale
@Alealeale:评论中的格式丢失了 - 请您能否将示例编辑到您的问题中? - Alex Riley
好的。已更新问题。感谢您的建议! - Alealeale
元素级均值和标准差是什么意思?通常情况下,均值和标准差是一堆值的平均值,而不是每个值的平均值,这是没有意义的。 - EdChum
3个回答

6

您可以创建一个数据框的面板,然后沿着项目轴计算均值和标准差:

df1 = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'])
df3 = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'])
p = pd.Panel({n: df for n, df in enumerate([df1, df2, df3])})

>>> p.mean(axis=0)
          A         B         C
0 -0.024284 -0.622337  0.581292
1  0.186271  0.596634 -0.498755
2  0.084591 -0.760567 -0.334429
3 -0.833688  0.403628  0.013497
4  0.402502 -0.017670 -0.369559
5  0.733305 -1.311827  0.463770
6 -0.941334  0.843020 -1.366963
7  0.134700  0.626846  0.994085
8 -0.783517  0.703030 -1.187082
9 -0.954325  0.514671 -0.370741

>>> p.std(axis=0)
          A         B         C
0  0.196526  1.870115  0.503855
1  0.719534  0.264991  1.232129
2  0.315741  0.773699  1.328869
3  1.169213  1.488852  1.149105
4  1.416236  1.157386  0.414532
5  0.554604  1.022169  1.324711
6  0.178940  1.107710  0.885941
7  1.270448  1.023748  1.102772
8  0.957550  0.355523  1.284814
9  0.582288  0.997909  1.566383

3
对于使用较新版 pandas 的用户,Panel 已在 0.25.0 版中移除。请参考此问题 - Raphael D.

2

这里有一个简单的解决方案,就是将现有的数据框连接成一个单一的数据框,并添加一个ID变量来跟踪原始来源:

dfa = pd.DataFrame( np.random.randn(2,2), columns=['a','b'] ).assign(id='a')
dfb = pd.DataFrame( np.random.randn(2,2), columns=['a','b'] ).assign(id='b')

df = pd.concat([df1,df2])

          a         b id
0 -0.542652  1.609213  a
1 -0.192136  0.458564  a
0 -0.231949 -0.000573  b
1  0.245715 -0.083786  b

现在你有两个2x2的数据框合并成了一个4x2的数据框。'id'列标识了源数据框,所以你没有失去任何泛化性,并且可以选择'id'来执行与任何单个数据框相同的操作。例如:df[ df['id'] == 'a' ]

但现在你也可以使用groupby对每个元素进行mean()std()等任何pandas方法:

df.groupby('id').mean()

              a         b
index                    
0      0.198164 -0.811475
1      0.639529  0.812810

你应该按照索引而不是id进行分组吧?仅按id分组只会计算数据帧内部的平均值。 - Raphael D.
1
@RaphaelD。可能吧。我只是想表明连接+分组的组合非常灵活,可以让您轻松地完成各种任务,包括您所建议的。 - JohnE
1
我明白了。你的回答对我的情况非常有帮助,特别是因为另一个答案在我的Pandas版本上不起作用。我只是想为未来的读者提供额外的细节。 - Raphael D.
@RaphaelD。没问题,很高兴这篇回答对你有帮助,如果你认为可以改进的话,请随意编辑我的回答。我回答这个问题已经很久了,记忆也不是很清晰。 - JohnE

0

以下解决方案对我有效。

average_data_frame = (dataframe1 + dataframe2 ) / 2

或者,如果你有超过两个数据框,比如说n,那么

average_data_frame = dataframe1
for i in range(1,n):
    average_data_frame = average_data_frame + i_th_dataframe
average_data_frame = average_data_frame / n

一旦你有了平均值,你就可以计算标准差。如果你想寻找一个“真正的Pythonic”方法,那么你应该查看其他答案。但如果你正在寻找一个可行且快速的解决方案,这就是它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接