首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中创建一个函数,用于根据多个条件从熊猫的dataframe值中创建桶

在Python中创建一个函数,用于根据多个条件从熊猫的dataframe值中创建桶
EN

Stack Overflow用户
提问于 2022-02-25 12:44:31
回答 1查看 689关注 0票数 0

我问了这个问题,这对我有帮助,但现在我的任务更复杂了。

My有~100个列和值,有14个刻度。

代码语言:javascript
复制
{'Diseasetype': {0: 'Oncology',
 1: 'Oncology',
 2: 'Oncology',
 3: 'Nononcology',
 4: 'Nononcology',
 5: 'Nononcology'},
'Procedures1': {0: 100, 1: 300, 2: 500, 3: 200, 4: 400, 5: 1000},
'Procedures2': {0: 1, 1: 3, 2: 5, 3: 2, 4: 4, 5: 10},
'Procedures100': {0: 1000, 1: 3000, 2: 5000, 3: 2000, 4: 4000, 5: 10000}}

我希望将dataframe的每一列中的每个值转换为桶值。

我目前的解决办法是:

代码语言:javascript
复制
def encoding(col, labels):
    return np.select([col<200, col.between(200,500), col.between(500,1000), col>1000], labels, 0)

onc_labels = [1,2,3,4]
nonc_labels = [11,22,33,44]
msk = df['Therapy_area'] == 'Oncology'

df[cols] = pd.concat((df.loc[msk, cols].apply(encoding, args=(onc_labels,)), df.loc[msk, cols].apply(encoding, args=(nonc_labels,)))).reset_index(drop=True)

如果数据same的所有列都具有相同的比例,那么它可以很好地工作,但是它们不是。记住,我有14个不同的尺度。

我想更新上面的代码(或者获得另一种解决方案),这将允许我存储数据。I不能使用相同范围的值来存储所有内容.

我的逻辑如下:

如果Disease == OncologyProcedures1具有此比例,则将值转换为这些桶(1、2、3)

如果Disease == OncologyProcedures2具有此比例,则将值转换为这些桶(1、2、3)

如果Disease != OncologyProcedures77具有此比例,则将值转换为这些桶(4、5、6)

比例和桶的例子:

肿瘤学Procedures1:< 200 = 1,200-400 = 2,>400 =3

肿瘤学Procedures2:<2= 1,2-4 = 2,>4 =3

肿瘤学Procedures3:< 2000 = 1,2000-4000 = 2,>4000 =3

Procedures1 for nonOncology:< 200 = 4,200-400 = 5,>400 =6

Procedures2 for nonOncology:<2= 4,2-4 = 5,>4 =6

Procedures3 for nonOncology:< 2000 = 4,2000-4000 = 5,>4000 =6

预期输出(乐意提供更多信息!)

代码语言:javascript
复制
Diseasetype Procedures1 Procedures2 Procedures100
Oncology        1             1           1
Oncology        2             2           2
Oncology        3             3           3
Nononcology     4             4           4
Nononcology     5             5           5
Nononcology     6             6           6

与规则的联系:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 14:14:46

我使用了一个带有所有比例的帮助文件(答案末尾的源):

使用melt将您的数据拉平,然后使用query过滤出您的行,最后使用pivot重塑您的数据。您可以独立执行每一行以显示转换:

代码语言:javascript
复制
scales = pd.read_csv('scales.csv').fillna({'Start': -np.inf, 'End': np.inf})
out = (
  df.melt('Diseasetype', var_name='Procedure', ignore_index=False).reset_index()
    .merge(scales, on=['Diseasetype', 'Procedure'], how='left')
    .query("value.between(Start, End)")
    .pivot_table('Label', ['index', 'Diseasetype'], 'Procedure').astype(int)
    .droplevel(0).rename_axis(columns=None).reset_index()
)

输出:

代码语言:javascript
复制
>>> df
   Diseasetype  Procedures1  Procedures100  Procedures2
0     Oncology            1              1            1
1     Oncology            2              2            2
2     Oncology            3              3            3
3  Nononcology            4              4            4
4  Nononcology            5              5            5
5  Nononcology            6              6            6

scales.csv含量

代码语言:javascript
复制
Diseasetype,Procedure,Start,End,Label
Oncology,Procedures1,,200,1
Oncology,Procedures1,200,400,2
Oncology,Procedures1,400,,3
Oncology,Procedures2,,2,1
Oncology,Procedures2,2,4,2
Oncology,Procedures2,4,,3
Oncology,Procedures100,,2000,1
Oncology,Procedures100,2000,4000,2
Oncology,Procedures100,4000,,3
Nononcology,Procedures1,,200,4
Nononcology,Procedures1,200,400,5
Nononcology,Procedures1,400,,6
Nononcology,Procedures2,,2,4
Nononcology,Procedures2,2,4,5
Nononcology,Procedures2,4,,6
Nononcology,Procedures100,,2000,4
Nononcology,Procedures100,2000,4000,5
Nononcology,Procedures100,4000,,6
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71266043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档