获取Pandas DataFrame每行百分位数(含中位数)的最优方法
实现方案
向量化最优方案(性能最高)
直接基于numpy对数值列的二维数组做轴向百分位计算,全程无Python层循环,性能比逐行遍历高两个数量级左右:
import pandas as pd import numpy as np # 定义分位值与对应输出列名 q_values = [10, 20, 30, 40, 50, 60, 70, 80, 90] stat_cols = ["10分位", "20分位", "30分位", "40分位", "中位数", "60分位", "70分位", "80分位", "90分位"] # 提取val列矩阵按行计算分位数 val_arr = df.filter(regex=r"^val\d+$").values stat_result = np.percentile(val_arr, q=q_values, axis=1).T # 合并年份列得到最终结果 result = pd.concat([df[["year"]], pd.DataFrame(stat_result, columns=stat_cols)], axis=1)
pandas原生语法方案(可读性更高)
如果更偏好pandas原生API,可使用quantile方法沿行轴计算,性能略低于numpy实现,但远高于逐行遍历:
q_values = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] stat_cols = ["10分位", "20分位", "30分位", "40分位", "中位数", "60分位", "70分位", "80分位", "90分位"] result = df[["year"]].join( df.filter(regex=r"^val\d+$") .quantile(q=q_values, axis=1) .T .set_axis(stat_cols, axis=1) )
两种方案都完全避免了逐行遍历,也不会产生大量无效中间列。
内容的提问来源于stack exchange,提问作者raven
相关产品推荐
相关产品推荐

