如何在Pandas中找到Units第50百分位数对应的Price?
找到Units列第50百分位数对应Price值的方法
首先还原你提供的DataFrame:
| Category | Units | Price |
|---|---|---|
| a | 4 | 3.5 |
| a | 5 | 4.5 |
| a | 3 | 7.8 |
| a | 8 | 11.5 |
| a | 1 | 15.5 |
| b | 5 | 2.1 |
| b | 6 | 4.5 |
| b | 3 | 6.5 |
下面分三种常见场景给出实现方法:
场景1:先求Units的50百分位数,再匹配对应Price
50百分位数即中位数,Pandas默认用线性插值计算(偶数个数据时取中间两数的平均值),如果需要匹配实际存在的Units值,可改用最近插值方式,代码如下:
import pandas as pd # 构造DataFrame data = { 'Category': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'], 'Units': [4, 5, 3, 8, 1, 5, 6, 3], 'Price': [3.5, 4.5, 7.8, 11.5, 15.5, 2.1, 4.5, 6.5] } df = pd.DataFrame(data) # 计算Units列的50百分位数(线性插值) units_median = df['Units'].quantile(0.5) # 计算最近的实际存在的Units中位数 units_median_nearest = df['Units'].quantile(0.5, interpolation='nearest') # 筛选对应Price:针对插值得到的非实际值用近似匹配 matching_prices = df[df['Units'].between(units_median - 0.01, units_median + 0.01)]['Price'] # 针对实际存在的Units值直接筛选 matching_prices_nearest = df[df['Units'] == units_median_nearest]['Price']
执行结果:
units_median为4.5(线性插值结果),无完全匹配的Units,matching_prices为空;units_median_nearest为5,对应的Price为[4.5, 2.1]。
场景2:按Units排序后,取50百分位位置的Price
如果需求是按Units排序后,取中位数位置对应行的Price,代码如下:
# 按Units升序排序 df_sorted = df.sort_values('Units').reset_index(drop=True) # 计算中位数位置(向下取整) median_pos = int(len(df_sorted) * 0.5) # 获取对应Price price_at_median_pos = df_sorted.loc[median_pos, 'Price']
排序后的前5行数据:
| Category | Units | Price |
|---|---|---|
| a | 1 | 15.5 |
| a | 3 | 7.8 |
| b | 3 | 6.5 |
| a | 4 | 3.5 |
| a | 5 | 4.5 |
median_pos 为 4,对应的Price是 4.5。
场景3:按Category分组计算
如果需要每个分类下,各自Units的50百分位数对应Price,可使用分组处理:
def get_median_price(group): sorted_group = group.sort_values('Units').reset_index(drop=True) pos = int(len(sorted_group) * 0.5) return sorted_group.loc[pos, 'Price'] grouped_result = df.groupby('Category').apply(get_median_price)
最终分组结果:
Category a 7.8 b 2.1 dtype: float64
内容的提问来源于stack exchange,提问作者SOUMYABRATA RAKSHIT
相关产品推荐
相关产品推荐

