鱼C论坛

 找回密码
 立即注册
查看: 450|回复: 3

[已解决]pandas按照条件判断填充一列的内容

[复制链接]
发表于 2024-9-12 11:04:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
放了一个附件,请求大佬们帮助。
内容是这样的。文本表格格式如下:
管线号                                                    焊缝编号        焊接类型        壁厚        材质
天然气80-NG-5310-10001-A0BE31-N(GC2)        1                  对焊        3.05        S31603&S31603
天然气80-NG-5310-10001-A0BE31-N(GC2)        2                  对焊        3.05        20
天然气80-NG-5310-10001-A0BE31-N(GC2)        3                 对焊                3.05        S31603
天然气80-NG-5310-10001-A0BE31-N(GC2)        4                 对焊               3.05        S31603&S31603
天然气80-NG-5310-10001-A0BE31-N(GC2)        5                 对焊               3.05        S31603&S31603
天然气80-NG-5310-10001-A0BE31-N(GC2)        6                 对焊              3.05        S31603&S31603
天然气80-NG-5310-10001-A0BE31-N(GC2)        7                 对焊              3.05        S31603&S31603
污水池甲烷气管线50-PG1-5310-10001-A0BE31-N(GC2)        1        对焊        3.05        S31603&S31603

我需要做到的是这样:
根据列"焊接类型","材质",“壁厚”的值依次判断,我用的pycharm,第三方用的pandas。
判断原则如下
1,如果是对焊,并且材质的文本内容包含“12Cr”,如果“壁厚”大于13,列“工艺卡编号”的值为"HKB12-06"
2,如果是对焊,并且材质的文本内容包含“12Cr”,如果“壁厚”大于10,列“工艺卡编号”的值为"HKB12-05"
3,如果是对焊,并且材质的文本内容包含“12Cr”,如果“壁厚”大于8,列“工艺卡编号”的值为"HKB12-04"
4,如果是承插焊,并且材质的文本内容包含“12Cr”,如果“壁厚”大于5.5,列“工艺卡编号”的值为"HKC12-03"
5,如果是承插焊,并且材质的文本内容包含“12Cr”,如果“壁厚”大于3,列“工艺卡编号”的值为"HKC12-02"

1,如果是对焊,并且材质的文本内容包含“20”,如果“壁厚”大于13,列“工艺卡编号”的值为"HKB20-06"
2,如果是对焊,并且材质的文本内容包含“20”,如果“壁厚”大于10,列“工艺卡编号”的值为"HKB20-05"
3,如果是对焊,并且材质的文本内容包含“20”,如果“壁厚”大于8,列“工艺卡编号”的值为"HKB20-04"
4,如果是承插焊,并且材质的文本内容包含“20,如果“壁厚”大于5.5,列“工艺卡编号”的值为"HKC20-03"
5,如果是承插焊,并且材质的文本内容包含“20”,如果“壁厚”大于3,列“工艺卡编号”的值为"HKC20-02"
以上条件都是一个成立了就不再执行其他判断
求助怎么实现呢
最佳答案
2024-9-12 12:56:49
颂风侯 发表于 2024-09-12 12:56
不想用numpy函数,还是想用熟悉层次的if函数可以吗?
...


当然可以使用 `apply` 和自定义函数来实现这个需求。以下是一个示例代码,展示如何根据不同条件填充“工艺卡编号”列:

  1. import pandas as pd

  2. # 创建示例数据框
  3. data = {
  4.     '管线号': [
  5.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  6.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  7.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  8.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  9.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  10.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  11.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  12.         '污水池甲烷气管线50-PG1-5310-10001-A0BE31-N(GC2)'
  13.     ],
  14.     '焊缝编号': [1, 2, 3, 4, 5, 6, 7, 1],
  15.     '焊接类型': ['对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊'],
  16.     '壁厚': [3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05],
  17.     '材质': ['S31603&S31603', '20', 'S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603']
  18. }

  19. df = pd.DataFrame(data)

  20. # 定义填充“工艺卡编号”的函数
  21. def fill_process_card(row):
  22.     if row['焊接类型'] == '对焊' and '12Cr' in row['材质']:
  23.         if row['壁厚'] > 13:
  24.             return 'HKB12-06'
  25.         elif row['壁厚'] > 10:
  26.             return 'HKB12-05'
  27.         elif row['壁厚'] > 8:
  28.             return 'HKB12-04'
  29.     elif row['焊接类型'] == '承插焊' and '12Cr' in row['材质']:
  30.         if row['壁厚'] > 5.5:
  31.             return 'HKC12-03'
  32.         elif row['壁厚'] > 3:
  33.             return 'HKC12-02'
  34.     elif row['焊接类型'] == '对焊' and '20' in row['材质']:
  35.         if row['壁厚'] > 13:
  36.             return 'HKB20-06'
  37.         elif row['壁厚'] > 10:
  38.             return 'HKB20-05'
  39.         elif row['壁厚'] > 8:
  40.             return 'HKB20-04'
  41.     elif row['焊接类型'] == '承插焊' and '20' in row['材质']:
  42.         if row['壁厚'] > 5.5:
  43.             return 'HKC20-03'
  44.         elif row['壁厚'] > 3:
  45.             return 'HKC20-02'
  46.     return None

  47. # 应用函数填充“工艺卡编号”列
  48. df['工艺卡编号'] = df.apply(fill_process_card, axis=1)

  49. print(df)
复制代码


这个代码定义了一个 `fill_process_card` 函数,根据你提供的条件来填充“工艺卡编号”列。然后使用 `apply` 方法将这个函数应用到数据框的每一行。这样可以确保代码逻辑清晰且易于理解。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

用于判断工艺卡编号的表格.zip

17.07 KB, 下载次数: 0

求助

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-12 11:04:32 | 显示全部楼层
鱼油,你好!根据你的需求,可以使用Pandas库来实现。以下是一个示例代码,展示如何根据不同条件填充“工艺卡编号”列:

  1. import pandas as pd

  2. # 创建示例数据框
  3. data = {
  4.     '管线号': ['天然气80-NG-5310-10001-A0BE31-N(GC2)']*7 + ['污水池甲烷气管线50-PG1-5310-10001-A0BE31-N(GC2)'],
  5.     '焊缝编号': [1, 2, 3, 4, 5, 6, 7, 1],
  6.     '焊接类型': ['对焊']*8,
  7.     '壁厚': [3.05]*8,
  8.     '材质': ['S31603&S31603', '20', 'S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603']
  9. }

  10. df = pd.DataFrame(data)

  11. # 定义条件和对应的值
  12. conditions = [
  13.     (df['焊接类型'] == '对焊') & (df['材质'].str.contains('12Cr')) & (df['壁厚'] > 13),
  14.     (df['焊接类型'] == '对焊') & (df['材质'].str.contains('12Cr')) & (df['壁厚'] > 10),
  15.     (df['焊接类型'] == '对焊') & (df['材质'].str.contains('12Cr')) & (df['壁厚'] > 8),
  16.     (df['焊接类型'] == '承插焊') & (df['材质'].str.contains('12Cr')) & (df['壁厚'] > 5.5),
  17.     (df['焊接类型'] == '承插焊') & (df['材质'].str.contains('12Cr')) & (df['壁厚'] > 3),
  18.     (df['焊接类型'] == '对焊') & (df['材质'].str.contains('20')) & (df['壁厚'] > 13),
  19.     (df['焊接类型'] == '对焊') & (df['材质'].str.contains('20')) & (df['壁厚'] > 10),
  20.     (df['焊接类型'] == '对焊') & (df['材质'].str.contains('20')) & (df['壁厚'] > 8),
  21.     (df['焊接类型'] == '承插焊') & (df['材质'].str.contains('20')) & (df['壁厚'] > 5.5),
  22.     (df['焊接类型'] == '承插焊') & (df['材质'].str.contains('20')) & (df['壁厚'] > 3)
  23. ]

  24. choices = [
  25.     'HKB12-06',
  26.     'HKB12-05',
  27.     'HKB12-04',
  28.     'HKC12-03',
  29.     'HKC12-02',
  30.     'HKB20-06',
  31.     'HKB20-05',
  32.     'HKB20-04',
  33.     'HKC20-03',
  34.     'HKC20-02'
  35. ]

  36. # 使用 numpy 的 select 函数来根据条件选择相应的值
  37. df['工艺卡编号'] = pd.Series(pd.NA)
  38. import numpy as np
  39. df['工艺卡编号'] = np.select(conditions, choices, default=None)

  40. print(df)
复制代码


此代码利用了`numpy.select`函数来根据多个条件应用相应的选择。请根据你的实际数据更新data部分,并确保已安装了`pandas`和`numpy`库:

  1. pip install pandas numpy
复制代码


希望以上代码能帮到你!有什么问题随时问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-12 12:56:33 | 显示全部楼层
不想用numpy函数,还是想用熟悉层次的if函数可以吗?
比如做个函数,进行填充
比如下面这样看起来清楚点
def city_type(x):
   if x['城市]in(['北京',上海',深圳']):
       return'一线'
   else:
       return'新一线
df['city type']=df.apply(city_type,axis=1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-12 12:56:49 | 显示全部楼层    本楼为最佳答案   
颂风侯 发表于 2024-09-12 12:56
不想用numpy函数,还是想用熟悉层次的if函数可以吗?
...


当然可以使用 `apply` 和自定义函数来实现这个需求。以下是一个示例代码,展示如何根据不同条件填充“工艺卡编号”列:

  1. import pandas as pd

  2. # 创建示例数据框
  3. data = {
  4.     '管线号': [
  5.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  6.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  7.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  8.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  9.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  10.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  11.         '天然气80-NG-5310-10001-A0BE31-N(GC2)',
  12.         '污水池甲烷气管线50-PG1-5310-10001-A0BE31-N(GC2)'
  13.     ],
  14.     '焊缝编号': [1, 2, 3, 4, 5, 6, 7, 1],
  15.     '焊接类型': ['对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊'],
  16.     '壁厚': [3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05],
  17.     '材质': ['S31603&S31603', '20', 'S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603', 'S31603&S31603']
  18. }

  19. df = pd.DataFrame(data)

  20. # 定义填充“工艺卡编号”的函数
  21. def fill_process_card(row):
  22.     if row['焊接类型'] == '对焊' and '12Cr' in row['材质']:
  23.         if row['壁厚'] > 13:
  24.             return 'HKB12-06'
  25.         elif row['壁厚'] > 10:
  26.             return 'HKB12-05'
  27.         elif row['壁厚'] > 8:
  28.             return 'HKB12-04'
  29.     elif row['焊接类型'] == '承插焊' and '12Cr' in row['材质']:
  30.         if row['壁厚'] > 5.5:
  31.             return 'HKC12-03'
  32.         elif row['壁厚'] > 3:
  33.             return 'HKC12-02'
  34.     elif row['焊接类型'] == '对焊' and '20' in row['材质']:
  35.         if row['壁厚'] > 13:
  36.             return 'HKB20-06'
  37.         elif row['壁厚'] > 10:
  38.             return 'HKB20-05'
  39.         elif row['壁厚'] > 8:
  40.             return 'HKB20-04'
  41.     elif row['焊接类型'] == '承插焊' and '20' in row['材质']:
  42.         if row['壁厚'] > 5.5:
  43.             return 'HKC20-03'
  44.         elif row['壁厚'] > 3:
  45.             return 'HKC20-02'
  46.     return None

  47. # 应用函数填充“工艺卡编号”列
  48. df['工艺卡编号'] = df.apply(fill_process_card, axis=1)

  49. print(df)
复制代码


这个代码定义了一个 `fill_process_card` 函数,根据你提供的条件来填充“工艺卡编号”列。然后使用 `apply` 方法将这个函数应用到数据框的每一行。这样可以确保代码逻辑清晰且易于理解。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 06:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表