【问题标题】:pandas describe by - additional parameterspandas describe by - 附加参数
【发布时间】:2021-07-14 15:50:51
【问题描述】:

我看到 pandas 库有一个 Describe by 函数,它返回一些有用的统计信息。但是,有没有办法在输出中添加额外的行,例如标准偏差 (.std) 和中值绝对偏差 (.mad) 或唯一值的计数?

我收到了df.describe(),但我不知道如何添加这些额外的摘要内容

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    默认的describe 如下所示:

    np.random.seed([3,1415])
    df = pd.DataFrame(np.random.rand(100, 5), columns=list('ABCDE'))
    
    df.describe()
    
                    A           B           C           D           E
    count  100.000000  100.000000  100.000000  100.000000  100.000000
    mean     0.495871    0.472939    0.455570    0.503899    0.451341
    std      0.303589    0.291968    0.294984    0.269936    0.284666
    min      0.006453    0.001559    0.001068    0.015311    0.009526
    25%      0.239379    0.219141    0.196251    0.294371    0.202956
    50%      0.529596    0.456548    0.376558    0.532002    0.432936
    75%      0.759452    0.739666    0.665563    0.730702    0.686793
    max      0.999799    0.994510    0.997271    0.981551    0.979221
    

    为 pandas > 0.21.0 更新
    我会制作自己的describe,如下所示。如何添加更多应该很明显。

    def describe(df, stats):
        d = df.describe()
        return d.append(df.reindex(d.columns, axis = 1).agg(stats))
    
    describe(df, ['skew', 'mad', 'kurt'])
    
                    A           B           C           D           E
    count  100.000000  100.000000  100.000000  100.000000  100.000000
    mean     0.495871    0.472939    0.455570    0.503899    0.451341
    std      0.303589    0.291968    0.294984    0.269936    0.284666
    min      0.006453    0.001559    0.001068    0.015311    0.009526
    25%      0.239379    0.219141    0.196251    0.294371    0.202956
    50%      0.529596    0.456548    0.376558    0.532002    0.432936
    75%      0.759452    0.739666    0.665563    0.730702    0.686793
    max      0.999799    0.994510    0.997271    0.981551    0.979221
    skew    -0.014942    0.048054    0.247244   -0.125151    0.066156
    mad      0.267730    0.249968    0.254351    0.228558    0.242874
    kurt    -1.323469   -1.223123   -1.095713   -1.083420   -1.148642
    

    为 pandas 0.20 更新
    我会制作自己的describe,如下所示。如何添加更多应该很明显。

    def describe(df, stats):
        d = df.describe()
        return d.append(df.reindex_axis(d.columns, 1).agg(stats))
    
    describe(df, ['skew', 'mad', 'kurt'])
    
                    A           B           C           D           E
    count  100.000000  100.000000  100.000000  100.000000  100.000000
    mean     0.495871    0.472939    0.455570    0.503899    0.451341
    std      0.303589    0.291968    0.294984    0.269936    0.284666
    min      0.006453    0.001559    0.001068    0.015311    0.009526
    25%      0.239379    0.219141    0.196251    0.294371    0.202956
    50%      0.529596    0.456548    0.376558    0.532002    0.432936
    75%      0.759452    0.739666    0.665563    0.730702    0.686793
    max      0.999799    0.994510    0.997271    0.981551    0.979221
    skew    -0.014942    0.048054    0.247244   -0.125151    0.066156
    mad      0.267730    0.249968    0.254351    0.228558    0.242874
    kurt    -1.323469   -1.223123   -1.095713   -1.083420   -1.148642
    

    旧答案

    def describe(df):
        return pd.concat([df.describe().T,
                          df.mad().rename('mad'),
                          df.skew().rename('skew'),
                          df.kurt().rename('kurt'),
                         ], axis=1).T
    
    describe(df)
    
                    A           B           C           D           E
    count  100.000000  100.000000  100.000000  100.000000  100.000000
    mean     0.495871    0.472939    0.455570    0.503899    0.451341
    std      0.303589    0.291968    0.294984    0.269936    0.284666
    min      0.006453    0.001559    0.001068    0.015311    0.009526
    25%      0.239379    0.219141    0.196251    0.294371    0.202956
    50%      0.529596    0.456548    0.376558    0.532002    0.432936
    75%      0.759452    0.739666    0.665563    0.730702    0.686793
    max      0.999799    0.994510    0.997271    0.981551    0.979221
    mad      0.267730    0.249968    0.254351    0.228558    0.242874
    skew    -0.014942    0.048054    0.247244   -0.125151    0.066156
    kurt    -1.323469   -1.223123   -1.095713   -1.083420   -1.148642
    

    【讨论】:

    【解决方案2】:

    piRSquared 的回答对我来说最有意义,但我收到了关于 Python 3.5 中 reindex_axis 的弃用警告。这对我有用:

        stats = data.describe()
        stats.loc['IQR'] = stats.loc['75%'] - stats.loc['25%'] # appending interquartile range instead of recalculating it
        stats = stats.append(data.reindex(stats.columns, axis=1).agg(['skew', 'mad', 'kurt']))
    

    【讨论】:

    • 知道如何做同样的事情,但是当我有一个分组数据框时? ``` df_var_desc_gr.groupby(['ethnicity_source_value'])['concepts'].describe() df_var_desc_gr.groupby(['ethnicity_source_value'])['concept_name'].describe() count mean std min 25% 50% 75 % 最大种族源值非洲 1.0 17.0 NaN 17.0 17.0 17.0 17.0 17.0 美国 1.0 153.0 NaN 153.0 153.0 153.0 153.0 153.0 ```
    【解决方案3】:

    试试这个:

     df.describe()
    
          num1  num2
    count   3.0   3.0
    mean    2.0   5.0
    std     1.0   1.0
    min     1.0   4.0
    25%     1.5   4.5
    50%     2.0   5.0
    75%     2.5   5.5
    max     3.0   6.0
    

    构建第二个 DataFrame。

     pd.DataFrame(df.mad() , columns = ["Mad"] ).T
    
             num1      num2
    Mad  0.666667  0.666667
    

    加入两个 DataFrame。

     pd.concat([df.describe(),pd.DataFrame(df.mad() , columns = ["Mad"] ).T ])
    
              num1      num2
    count  3.000000  3.000000
    mean   2.000000  5.000000
    std    1.000000  1.000000
    min    1.000000  4.000000
    25%    1.500000  4.500000
    50%    2.000000  5.000000
    75%    2.500000  5.500000
    max    3.000000  6.000000
    Mad    0.666667  0.666667
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2022-01-26
      • 2015-12-26
      • 2022-11-16
      • 2015-09-13
      • 2013-08-04
      • 2019-06-21
      相关资源
      最近更新 更多