1v1 on the road 2022-10-26 10:20 采纳率: 100%
浏览 25
已结题

判断当其它列满足多条件时,为特定列打标签

问题

在‘结果’列为满足条件的相应行逐一打标签,运行代码后,每次打完标签后会把前一次的覆盖掉。请问怎样可以同时打不同的标签?

代码
import pandas as pd
import numpy as np

df= pd.DataFrame({'产品': ['产品1', '产品2', '产品3', '产品4'],
                 'A列': ['收益', '收益好', '差', '收益'], 
                 'B列': ['金融收益', '航司收益', '收益', '收益'],
                 'C列': [10, 20, 30, 40],
                 '结果': ['待定','待定','待定','待定']})

list1 = '收益'
list2 = '航司|金融'

###Y1标签:C列的值>=40,且满足“B列包含list1任意内容的同时不包含list2所有内容” 或 “A列包含list1任意内容”:
df['结果'] = df[(df['B列'].str.contains(list1))&(~df['B列'].str.contains(list2))&(df['C列']>=40)]['结果'].replace({'待定':'Y1'})
print(df)

>>>以上打印输出结果:
   产品   A列    B列  C列   结果
0  产品1   收益  金融收益  10  NaN
1  产品2  收益好  航司收益  20  NaN
2  产品3    差    收益  30  NaN
3  产品4   收益    收益  40   Y1


###Y2标签:C列的值<40,且满足“B列包含list1任意内容的同时不包含list2所有内容” 或 “A列包含list1任意内容”:
df['结果'] = df[(df['B列'].str.contains(list1))&(~df['B列'].str.contains(list2))&(df['C列']<40)]['结果'].fillna('Y2')
print(df)

>>>以上打印输出结果:
    产品   A列    B列  C列   结果
0  产品1   收益  金融收益  10  NaN
1  产品2  收益好  航司收益  20  NaN
2  产品3    差    收益  30   Y2
3  产品4   收益    收益  40  NaN

###N1标签:C列的值<40,且满足“B列包含list2任意内容” :
df['结果'] = df[(df['B列'].str.contains(list2))&(df['C列']<40)]['结果'].fillna('N1')
print(df)

>>>以上打印输出结果:
    产品   A列    B列  C列   结果
0  产品1   收益  金融收益  10   N1
1  产品2  收益好  航司收益  20   N1
2  产品3    差    收益  30  NaN
3  产品4   收益    收益  40  NaN
想达到的结果

在有很多行数据时,可以按照以下逻辑为结果列打标签:
Y1标签:C列的值>=40,且满足“B列包含list1任意内容的同时不包含list2所有内容” 或 “A列包含list1任意内容”
Y2标签:C列的值<40,且满足“B列包含list1任意内容的同时不包含list2所有内容” 或 “A列包含list1任意内容”
N1标签:C列的值<40,且满足“B列包含list2任意内容”

    产品   A列    B列  C列   结果
0  产品1   收益  金融收益  10   N1
1  产品2  收益好  航司收益  20   N1
2  产品3    差    收益  30  Y2
3  产品4   收益    收益  40  Y1
  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-10-26 13:55
    关注

    这样写是不是就达到你想要的效果了?

    df.loc[(df['B列'].str.contains(list1))&(~df['B列'].str.contains(list2))&(df['C列']>=40),'结果'] = 'Y1'
    df.loc[(df['B列'].str.contains(list1))&(~df['B列'].str.contains(list2))&(df['C列']<40),'结果'] = 'Y2'
    df.loc[(df['B列'].str.contains(list2))&(df['C列']<40),'结果']='N1'
    
        产品   A列    B列  C列  结果
    0  产品1   收益  金融收益  10  N1
    1  产品2  收益好  航司收益  20  N1
    2  产品3    差    收益  30  Y2
    3  产品4   收益    收益  40  Y1
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月3日
  • 已采纳回答 10月26日
  • 创建了问题 10月26日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?