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

如何按列计算DataFrame中各数值列的十分位秩?

按列计算DataFrame每列的十分位秩值

嘿,这个问题我之前也踩过坑!直接用pd.qcut(df, 10, labels=False)确实会把整个DataFrame的所有数据混在一起计算分位数,完全不是按列独立计算的逻辑。要实现按列生成十分位秩,用apply()方法就能轻松解决——它会帮你把分箱逻辑逐个应用到每一列上。

核心解决方案代码

先给你最直接的实现方式,搭配示例DataFrame演示:

import pandas as pd
import numpy as np

# 生成测试用的DataFrame(包含不同分布的数值列)
np.random.seed(42)
df = pd.DataFrame({
    'col1': np.random.randn(100),  # 标准正态分布
    'col2': np.random.randn(100) * 2 + 5,  # 均值5、标准差2的正态分布
    'col3': np.random.randint(0, 100, 100)  # 0-99的整数
})

# 按列计算十分位秩(返回0-9的索引,对应第1到第10个十分位)
decile_ranks = df.apply(lambda col: pd.qcut(col, 10, labels=False))

# 查看结果
print(decile_ranks.head())

代码解释

  • df.apply()会遍历DataFrame的每一列,把每一列作为单独的Series传给lambda函数的col参数;
  • pd.qcut(col, 10, labels=False)针对当前列的数据,将其分成10个等频的分箱区间,labels=False表示返回每个值对应的分箱索引(从0开始计数);
  • 最终得到的decile_ranks是一个和原DataFrame形状完全一致的新DataFrame,每个值代表对应原数据在该列的十分位排名。

额外优化与注意事项

  1. 让标签从1开始计数:如果你希望十分位秩从1到10(而不是0到9),可以指定labels参数:
decile_ranks = df.apply(lambda col: pd.qcut(col, 10, labels=range(1, 11)))
  1. 处理重复值过多的情况:如果某列存在大量重复值,导致无法均匀分成10个分箱,会抛出错误。这时可以添加duplicates='drop'参数自动调整分位数,避免报错:
decile_ranks = df.apply(lambda col: pd.qcut(col, 10, labels=False, duplicates='drop'))
  1. 处理缺失值:如果列中有NaN,pd.qcut会默认保留这些缺失值,结果对应位置也是NaN。如果需要提前去除缺失值,可以在lambda里先处理:
decile_ranks = df.apply(lambda col: pd.qcut(col.dropna(), 10, labels=False).reindex(col.index))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:40:19