【问题标题】:calculating percentile values for each columns group by another column values - Pandas dataframe计算由另一列值分组的每列的百分位值 - Pandas 数据框
【发布时间】:2020-02-05 01:36:42
【问题描述】:

我有一个如下所示的数据框 -

   Year  Salary  Amount
0  2019    1200      53
1  2020    3443     455
2  2021    6777     123
3  2019    5466     313
4  2020    4656     545
5  2021    4565     775
6  2019    4654     567
7  2020    7867     657
8  2021    6766     567

获取下面数据框的 Python 脚本 -

import pandas as pd
import numpy as np

d = pd.DataFrame({
    'Year': [
        2019,
        2020,
        2021,
    ] * 3,
    'Salary': [
        1200,
        3443,
        6777,
        5466,
        4656,
        4565,
        4654,
        7867,
        6766
    ],
    'Amount': [
        53,
        455,
        123,
        313,
        545,
        775,
        567,
        657,
        567
    ]
})

我想为按“年份”分组的所有列计算某些百分位值。 所需的输出应该看起来像 -

我在 python 脚本下运行以执行计算以计算某些百分位值-

df_percentile = pd.DataFrame()
p_list = [0.05, 0.10, 0.25, 0.50, 0.75, 0.95, 0.99]
c_list = []
p_values = []
for cols in d.columns[1:]:
    for p in p_list:
        c_list.append(cols + '_' + str(p))
        p_values.append(np.percentile(d[cols], p))
print(len(c_list), len(p_values))
df_percentile['Name'] = pd.Series(c_list)
df_percentile['Value'] = pd.Series(p_values)
print(df_percentile)

输出 -

           Name      Value
0   Salary_0.05  1208.9720
1    Salary_0.1  1217.9440
2   Salary_0.25  1244.8600
3    Salary_0.5  1289.7200
4   Salary_0.75  1334.5800
5   Salary_0.95  1370.4680
6   Salary_0.99  1377.6456
7   Amount_0.05    53.2800
8    Amount_0.1    53.5600
9   Amount_0.25    54.4000
10   Amount_0.5    55.8000
11  Amount_0.75    57.2000
12  Amount_0.95    58.3200
13  Amount_0.99    58.5440

如何获得所需格式的输出,而无需进行额外的数据操作/格式化或使用更少的代码行?

【问题讨论】:

    标签: python pandas numpy dataframe percentile


    【解决方案1】:

    您可以尝试pivot 后跟quantile

    (df.pivot(columns='Year')
       .quantile([0.01,0.05,0.75, 0.95, 0.99])
       .stack('Year')
    )
    

    输出:

                Salary  Amount
         Year                 
    0.01 2019  1269.08   58.20
         2020  3467.26  456.80
         2021  4609.02  131.88
    0.05 2019  1545.40   79.00
         2020  3564.30  464.00
         2021  4785.10  167.40
    0.75 2019  5060.00  440.00
         2020  6261.50  601.00
         2021  6771.50  671.00
    0.95 2019  5384.80  541.60
         2020  7545.90  645.80
         2021  6775.90  754.20
    0.99 2019  5449.76  561.92
         2020  7802.78  654.76
         2021  6776.78  770.84
    

    【讨论】:

    • 谢谢!如果我这样做 - df.reset_index(inplace=True) ; df.rename(columns={'level_0':'Percentile'}, inplace=True)。输出非常接近我正在寻找的 - 它只是按百分位数而不是年份分组。
    • 您可以通过sort_values(['Year', 'Percentile']) 获得所需的分组。
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2020-10-07
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多