我正在努力在一个基于已有列的df中使用条件创建一个新的col.本质上,如果客户合同号包含下划线,我希望新列中的值是下划线之前的所有字符,否则我希望它是删除所有破折号的客户合同号.我可以用下面的命令删除破折号,但第二行不行

raw_data_df['Search Text'] = raw_data_df['Client Contract Number'].str.replace('-','')

raw_data_df['Search Text'] = raw_data_df['Client Contract Number'].str.split('_')[0] if raw_data_df['Client Contract Number'].str.contains("_") else raw_data_df['Client Contract Number'].str.replace('-','')

推荐答案

您不需要显式地搜索_,只需使用(^[^_]+)模式(所有锚定在左侧的字符都不是_)搜索字符串的第一部分(这比split更有效):

raw_data_df['Search Text'] = (raw_data_df['Client Contract Number']
                              .str.extract(r'(^[^_]+)', expand=False)
                              .str.replace('-', '')
                              )

或者,使用列表理解对您的原始方法进行修正.同样,不需要显式测试是否存在_,因为如果不存在,则Split将生成相同的字符串.

raw_data_df['Search Text'] = [s.split('_')[0].replace('-', '') for s in
                              raw_data_df['Client Contract Number']]

如果您确实需要测试_是否存在,以便对字符串进行不同的处理(例如,如果没有下划线,则保留-),您可以这样做:

raw_data_df['Search Text'] = [x[0]
                              if len(x:=s.split('_', maxsplit=1) == 1
                              else x[0].replace('-', '')
                              for s in
                              raw_data_df['Client Contract Number']]

并使用显式判断(我认为这可能效率较低):

raw_data_df['Search Text'] = [s.split('_', maxsplit=1)[0].replace('-', '')
                              if `_` in s else s
                              for s in raw_data_df['Client Contract Number']]

Python相关问答推荐

预期LP_c_Short实例而不是_ctyles.PyCStructType

CustomTKinter-向表单添加额外的输入字段

如何在Power Query中按名称和时间总和进行分组

如何观察cv2.erode()的中间过程?

如何匹配3D圆柱体的轴和半径?

Numpy索引argsorted使用integer数组,同时保留排序顺序

如何使用bs 4从元素中提取文本

Odoo -无法比较使用@api.depends设置计算字段的日期

使用mySQL的SQlalchemy过滤重叠时间段

比较两个数据帧并并排附加结果(获取性能警告)

将特定列信息移动到当前行下的新行

时间序列分解

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

为什么符号没有按顺序添加?

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

Pandas Loc Select 到NaN和值列表

未知依赖项pin—1阻止conda安装""

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

Tkinter菜单自发添加额外项目

Flask Jinja2如果语句总是计算为false&