Python Pandas 计算每行的百分位数

Python Pandas Calculating Percentile per row

我有以下代码,想为每个交易编号和描述创建一个新列,代表每行的第 99 个百分位数。

我真的很难做到这一点 - 似乎大多数帖子都涉及计算列上的百分位数。

有办法实现吗?我希望创建一个包含两行的新列。

df_baseScenario = pd.DataFrame({'Transaction Number' : [1,10],
                            'Description'      :['asf','def'],
                            'Calc_PV_CF_2479.0':[4418494.085,-3706270.679],
                            'Calc_PV_CF_2480.0':[4415476.321,-3688327.494],
                            'Calc_PV_CF_2481.0':[4421698.198,-3712887.034],
                            'Calc_PV_CF_2482.0':[4420541.944,-3706402.147],
                            'Calc_PV_CF_2483.0':[4396063.863,-3717554.946],
                            'Calc_PV_CF_2484.0':[4397897.082,-3695272.043],
                            'Calc_PV_CF_2485.0':[4394773.762,-3724893.702],
                            'Calc_PV_CF_2486.0':[4384868.476,-3741759.048],
                            'Calc_PV_CF_2487.0':[4379614.337,-3717010.873],
                            'Calc_PV_CF_2488.0':[4389307.584,-3754514.639],
                            'Calc_PV_CF_2489.0':[4400699.929,-3741759.048],
                            'Calc_PV_CF_2490.0':[4379651.262,-3714723.435]})    

以下应该有效:

df['99th_percentile'] = df[cols].apply(lambda x: numpy.percentile(x, 99), axis=1)

我在这里假设变量 'cols' 包含您要包含在百分位数中的列的列表(例如,您显然不能在计算中使用描述)。

此代码的作用是遍历数据帧中的行,并针对每一行计算 numpy.percentile 以获得第 99 个百分位数。您需要导入 numpy。

如果您需要最大速度,那么您可以使用 numpy.vectorize 以牺牲可读性为代价删除所有循环(未测试):

perc99 = np.vectorize(lambda x: numpy.percentile(x, 99))
df['99th_percentile'] = perc99(df[cols].values)

从@mxbi 稍作修改。

import numpy as np
df = df_baseScenario.drop(['Transaction Number','Description'], axis=1)
df_baseScenario['99th_percentile'] = df.apply(lambda x: np.percentile(x, 99), axis=1)