Pandas使用自定义函数按指定步长计算列分位数生成新DataFrame
首先说明你原有自定义函数存在一个小笔误:函数内引用的data变量没有定义,实际应该是传入的每列数据,我们先修正这个问题。
接下来不用循环,直接用Pandas的聚合方法就能快速完成计算,有两种可选实现方案:
方案1:沿用你的自定义函数实现
修正后的函数和完整代码如下:
import math import pandas as pd # 修正后的分位数计算函数,接收单列数据作为输入 def get_percentile(ser, percentile): n = len(ser) p = n * percentile / 100 sorted_ser = sorted(ser) if p.is_integer(): return sorted_ser[int(p)] else: return sorted_ser[int(math.ceil(p)) - 1] # 你的原始DataFrame df = pd.DataFrame({ 'alligator_apple': range(1, 11), 'barbadine': range(11, 21), 'capulin_cherry': range(21, 31) }) # 要计算的分位列表 percents = list(range(25, 51, 5)) # 聚合计算所有分位,调整格式匹配预期输出 result = df.agg([lambda x: get_percentile(x, p) for p in percents]) result.index = percents result = result.reset_index(names='percentile')
方案2:直接用Pandas内置quantile方法,无需自定义函数
你写的分位数计算逻辑和Pandas的method='nearest'插值规则完全匹配,直接调用内置方法性能更高,代码更简洁:
import pandas as pd df = pd.DataFrame({ 'alligator_apple': range(1, 11), 'barbadine': range(11, 21), 'capulin_cherry': range(21, 31) }) # 转换为0-1区间的分位值 percents = [x/100 for x in range(25, 51, 5)] # 直接计算所有分位,调整格式匹配预期输出 result = df.quantile(percents, method='nearest').reset_index(names='percentile') result['percentile'] = result['percentile'] * 100
两种方案输出的结果都和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者Agnes Lee
相关产品推荐
相关产品推荐

