【问题标题】:Python Pandas Calculating Percentile per rowPython Pandas 计算每行的百分位数
【发布时间】:2017-05-17 16:53:07
【问题描述】:

我有以下代码,想为每个事务编号和描述创建一个新列,表示每行的第 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]})    

【问题讨论】:

  • 您提供的只是DataFrame,而不是您自己计算这个百分位数的任何尝试......如果您展示您所需输出的样本也会有所帮助。
  • 抱歉,我对此很陌生,并且在逻辑上苦苦挣扎。我理解以后的帖子。

标签: python pandas dataframe percentile


【解决方案1】:

以下应该有效:

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)

【讨论】:

  • 这太好了,谢谢。我最初预计循环会很慢,并认为传递向量/矩阵可能是更好的方法。你对此有看法吗?
  • @Travis 循环可能会引入一些延迟,但这对于一百万行来说不会超过几秒钟。这是一个更快的方法:df['99th_percentile'] = [numpy.percentile(x, 99) for x in df[cols].values],它几乎没有开销,但有点难看。检查我的答案编辑以获得我能想到的最快值。
【解决方案2】:

根据@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 2020-12-01
    • 2017-11-20
    • 2019-03-27
    • 2019-05-10
    • 2017-06-20
    • 2021-12-22
    • 2011-12-29
    相关资源
    最近更新 更多