You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 09:30:05