【问题标题】:Element-wise average and standard deviation across multiple dataframes跨多个数据帧的元素平均和标准偏差
【发布时间】:2015-06-08 22:06:31
【问题描述】:

数据: 相同格式的多个数据框(相同的列,相同的行数,并且没有丢失点)。

如何创建包含每个元素的元素均值的“摘要”数据框?包含元素标准差的数据框怎么样?

          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

【问题讨论】:

  • 能否提供一些示例数据框?
  • 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`ABC 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 0.528789 6 -0.483008 1.472787`
  • @Alealeale:格式在 cmets 中丢失 - 请您将示例编辑到您的问题中吗?
  • 好的。更新了问题。谢谢你的建议!
  • 是什么意思 element-wise mean 和 std dev?每个平均值代表什么通常是平均值,std-dev 是一堆值的平均值,而不是每个没有意义的值的平均值

标签: python python-3.x pandas


【解决方案1】:

以下解决方案对我有用。

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”方法,则应遵循其他答案。但是,如果您正在寻找一种有效且快速的解决方案,就是这样。

【讨论】:

    【解决方案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 逐个元素地执行任何pandas 方法,例如mean()std()

    df.groupby('id').mean()
    
                  a         b
    index                    
    0      0.198164 -0.811475
    1      0.639529  0.812810
    

    【讨论】:

    • 您不应该按索引而不是 id 进行分组吗?按 id 分组仅计算数据帧内平均值。
    • @RaphaelD。可能。我只是想表明串联 + groupby 的组合非常灵活,可以让您轻松地做各种事情,包括您的建议。
    • 我明白了。你的回答对我来说真的很有帮助,特别是因为另一个不能使用我的 Pandas 版本。我只是想为未来的读者提供更多细节。
    • @RaphaelD。没问题,很高兴这很有帮助,如果您认为可以改进它,请随时编辑我的答案。很久以前就回答过了,脑子里不是很新鲜。
    【解决方案3】:

    您可以创建一个 DataFrame 面板,然后沿项目轴计算平均值和 SD:

    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
    

    【讨论】:

    • 对于那些使用最新版 pandas 的用户,Panel 在 0.25.0 中被移除。见this question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2021-04-25
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多