我有以下代码,并希望为每个交易编号和描述创建一个新列,以表示每一行的第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)

08-24 16:11