鱼C论坛

 找回密码
 立即注册
查看: 169|回复: 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` 和自定义函数来实现这个需求。以下是一个示例代码,展示如何根据不同条件填充“工艺卡编号”列:
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)'
    ],
    '焊缝编号': [1, 2, 3, 4, 5, 6, 7, 1],
    '焊接类型': ['对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊'],
    '壁厚': [3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05],
    '材质': ['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 小助理,如未能正确解答您的问题,请继续追问。

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

17.07 KB, 下载次数: 0

求助

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)'],
    '焊缝编号': [1, 2, 3, 4, 5, 6, 7, 1],
    '焊接类型': ['对焊']*8,
    '壁厚': [3.05]*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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)'
    ],
    '焊缝编号': [1, 2, 3, 4, 5, 6, 7, 1],
    '焊接类型': ['对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊', '对焊'],
    '壁厚': [3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05, 3.05],
    '材质': ['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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 18:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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