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 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看