【问题标题】:Get mean of multiple selected columns in a pandas dataframe获取熊猫数据框中多个选定列的平均值
【发布时间】:2020-08-09 01:50:29
【问题描述】:

我想计算数据框中选定列中所有值的平均值。例如,我有一个包含 A、B、C、D 和 E 列的数据框,我想要 A、C 和 E 列中所有值的平均值。

import pandas as pd

df1 = pd.DataFrame( ( {'A': [1,2,3,4,5],
                      'B': [10,20,30,40,50],
                      'C': [11,21,31,41,51],
                      'D': [12,22,32,42,52],
                      'E': [13,23,33,43,53]} ) )

print( df1 )

print( "Mean of df1:", df1.mean() )

df2 = pd.concat( [df1['A'], df1['C'], df1['E'] ], ignore_index=True )
print( df2 )
print( "Mean of df2:", df2.mean() )

df3 = pd.DataFrame()
df3 = pd.concat( [ df3, df1['A'] ], ignore_index=True )
df3 = pd.concat( [ df3, df1['C'] ], ignore_index=True )
df3 = pd.concat( [ df3, df1['E'] ], ignore_index=True )
print( df3 )
print( "Mean of df3:", df3.mean() )

df2 为我提供了正确的答案,但我需要创建一个新的数据框来获得它。

我虽然像df1['A', 'C', 'E'].mean() 这样的东西会起作用,但它会返回每列的平均值,而不是组合平均值。有没有办法在不创建新数据框的情况下做到这一点?我还需要其他数据统计信息,例如 .std()、.min()、max(),所以这不仅仅是一次性计算。

【问题讨论】:

    标签: python pandas multiple-columns mean


    【解决方案1】:

    您可以通过DataFrame.stackDataFrame 重塑为Series with Multiindex,然后使用mean

    df2 = df1[['A', 'C', 'E']].stack()
    print (df2)
    0  A     1
       C    11
       E    13
    1  A     2
       C    21
       E    23
    2  A     3
       C    31
       E    33
    3  A     4
       C    41
       E    43
    4  A     5
       C    51
       E    53
    dtype: int64
    
    print( "Mean of df2:", df2.mean() )
    Mean of df2: 22.333333333333332
    

    另一个想法是将值转换为 numpy 二维数组,然后使用np.mean

    df21 = df1[['A', 'C', 'E']]
    print( df21 )
       A   C   E
    0  1  11  13
    1  2  21  23
    2  3  31  33
    3  4  41  43
    4  5  51  53
    
    print(df21.to_numpy())
    [[ 1 11 13]
     [ 2 21 23]
     [ 3 31 33]
     [ 4 41 43]
     [ 5 51 53]]
    
    print( "Mean of df2:", np.mean(df21.to_numpy()) )
    Mean of df2: 22.333333333333332
    

    【讨论】:

      【解决方案2】:

      警告:仅当列的长度相同时才可以。如果不是,它会给出错误的答案(正如 cmets 指出的那样)。

      mean = df1[['A', 'C', 'E']].mean(axis=1).mean()    
      print(mean)
      

      【讨论】:

      • @jezrael 在这种情况下不是,因为每个列具有相同数量的元素。因此df1[['A', 'B', 'C']].mean().mean() == df1[['A', 'C', 'E']].stack().mean().
      • 确实,@jezrael 是对的,如果它们的长度不同,那将是不同的。所以我要提醒的是,只有当列的长度相同时它才会起作用。
      【解决方案3】:

      据我所知,您有两个选择:

      对于mean()、min()、max(),你可以使用mean of mean、min of min、max of max这将产生A、C、E的所有元素的平均值、最小值、最大值。

      所以你可以使用: 对于均值():enter code here

      df1[['A','C','E']].apply(np.mean).mean()
      df1[['A','C','E']].values.mean() 
      

      以上任何一项都应为您提供 A、C、E 列所有元素的平均值。

      对于 min():

      df1[['A','C','E']].apply(np.min).min()
      df1[['A','C','E']].values.min()  
      

      对于 max():

      df1[['A','C','E']].apply(np.max).max()
      df1[['A','C','E']].values.max() 
      

      对于标准()

      df1[['A','C','E']].apply(np.std).std()    ##  this will not give error, but gives a 
                             value that is not what you want.
      df1[['A','C','E']].values.std()    # this gives the std of all the elements of columns A, C, E.
      

      std of std 不会给出所有元素的 std。

      【讨论】:

      • 当我使用 std= df1[['A','C','E']].values.std() 时,我得到的值是 17.93,而正确的值应该是 18.56。
      • A、C、E 列具有元素 [1、11、13、2、21、23、3、31、33、4、41、43、5、51、53]。这就是您获取 A、C、E 元素的方式: df1[['A','C','E']].stack().values ; np.std([1, 11, 13, 2, 21, 23, 3, 31, 33, 4, 41, 43, 5, 51, 53]) 给出 17.93197020841702;你是怎么得到 18.56 的?
      • df2 = pd.concat( [df1['A'], df1['C'], df1['E'] ], ignore_index=True ) 产生df2.std()=18.5613df1[['A','C','E']].values.std()=17.9319
      • 使用 n 计算总体的标准偏差,其中使用 (n-1) 计算样本的标准差。当您应用 df2.std() 时,它采用默认值为 n-1,这是使用参数 ddof = 1 设置的。如果将此参数设置为 0,即 ddof = 0,您将获得 17.93 df2 的值。 std(ddof = 0) ## 给出 17.93 ;这里 n (15) 用于计算 df2.std(ddof = 1) ## 给出 18.5613 ;这里取 n -1 (14) 进行计算请看一下总体标准差与样本标准差。
      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 2019-04-16
      • 2021-09-25
      • 2016-07-27
      • 2023-04-07
      • 2021-08-20
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多