颂风侯 发表于 2024-9-12 11:04:16

pandas按照条件判断填充一列的内容

放了一个附件,请求大佬们帮助。
内容是这样的。文本表格格式如下:
管线号                                                    焊缝编号        焊接类型        壁厚        材质
天然气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"
以上条件都是一个成立了就不再执行其他判断
求助怎么实现呢

FishC 发表于 2024-9-12 11:04:32

鱼油,你好!根据你的需求,可以使用Pandas库来实现。以下是一个示例代码,展示如何根据不同条件填充“工艺卡编号”列:

import pandas as pd

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

df = pd.DataFrame(data)

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

choices = [
    'HKB12-06',
    'HKB12-05',
    'HKB12-04',
    'HKC12-03',
    'HKC12-02',
    'HKB20-06',
    'HKB20-05',
    'HKB20-04',
    'HKC20-03',
    'HKC20-02'
]

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

print(df)

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

pip install pandas numpy

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

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

颂风侯 发表于 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)

FishC 发表于 2024-9-12 12:56:49

颂风侯 发表于 2024-09-12 12:56
不想用numpy函数,还是想用熟悉层次的if函数可以吗?
...

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

import pandas as pd

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

df = pd.DataFrame(data)

# 定义填充“工艺卡编号”的函数
def fill_process_card(row):
    if row['焊接类型'] == '对焊' and '12Cr' in row['材质']:
      if row['壁厚'] > 13:
            return 'HKB12-06'
      elif row['壁厚'] > 10:
            return 'HKB12-05'
      elif row['壁厚'] > 8:
            return 'HKB12-04'
    elif row['焊接类型'] == '承插焊' and '12Cr' in row['材质']:
      if row['壁厚'] > 5.5:
            return 'HKC12-03'
      elif row['壁厚'] > 3:
            return 'HKC12-02'
    elif row['焊接类型'] == '对焊' and '20' in row['材质']:
      if row['壁厚'] > 13:
            return 'HKB20-06'
      elif row['壁厚'] > 10:
            return 'HKB20-05'
      elif row['壁厚'] > 8:
            return 'HKB20-04'
    elif row['焊接类型'] == '承插焊' and '20' in row['材质']:
      if row['壁厚'] > 5.5:
            return 'HKC20-03'
      elif row['壁厚'] > 3:
            return 'HKC20-02'
    return None

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

print(df)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: pandas按照条件判断填充一列的内容