如何将Pandas DataFrame中的列转换为四分位数标签?
解决方法
你需要的是等宽区间划分(而非基于数据分布的统计四分位数),用pd.cut()方法就能直接实现,无需使用transform。具体操作步骤如下:
1. 构造原始DataFrame
先把你提供的数据转换成Pandas DataFrame:
import pandas as pd data = { 'columnA': [3,73,2,-2,4,8,23,13,2,0,1,2,7,2,2,5], 'columnB': [-1,2,13,24,1,2,3,5,2,3,4,1,2,1,2,3] } df = pd.DataFrame(data)
2. 定义自定义四分区间边界
按照你给出的区间范围,设定边界列表:
bins = [-2, 16.75, 35.5, 54.25, 73]
pd.cut()默认采用左闭右开的区间规则,刚好匹配你定义的四分区间(比如第1四分位[-2,16.75]、第2四分位[16.75,35.5]等)。
3. 划分区间并映射为四分位数编号
用pd.cut()将columnA的值归入对应区间,再通过cat.codes获取区间索引,最后加1得到1-4的四分位数编号:
# 将columnA的值划入指定区间,得到分类类型数据 df['columnA'] = pd.cut(df['columnA'], bins=bins) # 将分类区间转换为1-4的四分位数编号 df['columnA'] = df['columnA'].cat.codes + 1
4. 最终结果
执行后得到的DataFrame与你给出的示例完全一致:
columnA columnB 0 1 -1 1 4 2 2 1 13 3 1 24 4 1 1 5 1 2 6 2 3 7 1 5 8 1 2 9 1 3 10 1 4 11 1 1 12 1 2 13 1 1 14 1 2 15 1 3
补充说明
- 若不想覆盖原始
columnA数据,可以新建一列存储结果:
df['columnA_quartile'] = pd.cut(df['columnA'], bins=bins).cat.codes + 1
- 如果后续需要基于数据分布的统计四分位数(而非等宽区间),可以使用
pd.qcut()方法,但你的需求是自定义等宽区间,pd.cut()是更合适的选择。
内容的提问来源于stack exchange,提问作者Ishigami
相关产品推荐
相关产品推荐

