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 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据