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

如何让Postgres与Pandas的百分位计算结果匹配?

Postgres percentile_cont与Pandas quantile百分位计算结果不一致排查

背景

我需要验证Postgres与Pandas的百分位计算结果一致性,目标是25th、50th、75th百分位,Postgres使用percentile_cont()函数(统计场景需求),但两者75th百分位结果始终不匹配。

Postgres实现与结果

SQL查询语句:

SELECT percentile_cont(0.25) WITHIN GROUP (order by obs1) as q1
     , percentile_cont(0.5) WITHIN GROUP (order by obs1) as med
     , percentile_cont(0.75) WITHIN GROUP (order by obs1) as q3
FROM my_table;

返回结果:q1=73.99,med=74.0,q3=74.0085

Pandas实现与结果

已按照资料设置interpolation='linear'以匹配Postgres的线性插值逻辑:

import pandas as pd

dataframe = pd.read_sql(sql='SELECT obs1 FROM my_table', con='my_connection_info')
dataframe = dataframe.sort_values(by='obs1')
percentiles = dataframe.quantile(q=[0.25, 0.5, 0.75],
                                 axis=0,
                                 numeric_only=False,
                                 interpolation='linear',
                                 method='single')

计算结果:

obs1
0.25  73.992
0.50  74.000
0.75  74.006

已完成的排查步骤

  • 给Postgres查询结果添加::numeric转换,结果无变化
  • 确认数据库中obs1列数据类型为float8
  • 验证两边使用的数据集均为25条记录
  • 因业务需求必须使用percentile_cont(),测试percentile_disc()得到74.009,仍与Pandas结果不符
  • q1、q2结果匹配,说明两边排序逻辑一致

手动计算疑问

25条排序后的数据,75th百分位对应位置为25*0.75=18.75,第18、19位的值均为74.006,完全无法理解Postgres得出的74.0085是如何计算的,也不知道如何调整让两者结果匹配以完成验证。

完整排序数据集

obs1
24  73.982
12  73.983
18  73.984
7   73.985
2   73.988
20  73.988
4   73.992
10  73.994
16  73.994
1   73.995
6   73.995
9   73.998
15  74.000
19  74.000
3   74.002
11  74.004
21  74.004
13  74.006
17  74.006
8   74.008
5   74.009
22  74.010
14  74.012
23  74.015
0   74.030

内容的提问来源于stack exchange,提问作者Python_Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:44:54