python - 根据另一列python中的值范围创建带有桶的列
问题描述
我有一个样本 df
一个 | 乙 |
---|---|
X | 30 |
是 | 150 |
Z | 450 |
XX | 300 |
我需要创建另一个 C 列,根据一些断点将 B 列存储起来
断点 = [50,100,250,350]
一个 | 乙 | C |
---|---|---|
X | 30 | '0-50' |
是 | 150 | '100-250' |
Z | 450 | '>350' |
XX | 300 | '250-350' |
我有以下有效的代码
def conditions(i):
if i <=50: return '0-50'
if i > 50 and i <=100: return '50-100'
if i > 100 and i <=250: return '100-250'
if i > 250 and i <=350: return '250-350'
if i > 350: return '>350'
df['C']=df['B'].apply(conditions)
但是我想让breakpts动态。因此,如果我使用不同的中断点,例如 [100,250,300,400],代码应该会根据中断点自动创建不同的存储桶。
关于如何做到这一点的任何想法?
解决方案
正如评论中指出的那样,pd.cut()
这将是要走的路。您可以使分手动态化并自己设置:
import pandas as pd
import numpy as np
bins = [0,50, 100,250, 350, np.inf]
labels = ["'0-50'","'50-100'","'100-250'","'250-350'","'>350'"]
df['C'] = pd.cut(df['B'], bins=bins, labels=labels)
看看pandas.qcut
哪个是基于分位数的离散化函数。
或者,使用np.select
:
col = 'B'
conditions = [
df[col].between(0,50), # inclusive = True is the default
df[col].between(50,100),
df[col].between(100,250),
df[col].between(250,350),
df[col].ge(350)
]
choices = ["'0-50'","'50-100'","'100-250'","'250-350'","'>350'"]
df["C"] = np.select(conditions, choices, default=np.nan)
两者都打印:
A B C
0 X 30 '0-50'
1 Y 150 '100-250'
2 Z 450 '>350'
3 XX 300 '250-350'
推荐阅读
- node.js - 在猫鼬中更新数组内的多个对象
- mysql - 我如何将 dapp 连接到数据库(mysql)
- python - “where子句”中的未知列“距离”
- python - PyQT5 QTimer timer.start() 是重叠功能还是等到功能结束?
- c++ - Microsoft Visual Studio Code 在运行可执行文件时不执行任何操作
- flutter - Flutter:生成具有多个键值对的二维码
- css - 从垫子菜单中删除垫子按钮焦点
- oracle-apex - 交互式报表透视,ORA-06502
- java - 分页和规范使用 Spring Data
- javascript - Express js 中的 next() 去哪儿了?