如何基于列值开头条件在DataFrame中创建自定义列?
基于Error列内容创建Error Type列的最优解法
首先先确认你的DataFrame结构(按你提供的内容整理成表格):
| Person Number | Error | Department Name | Country | |
|---|---|---|---|---|
| CZ | 10054609 | The identifier 11380151 is used by Veronika Fi... | CZ:Supply Chain Pohořelice 1 Henkel Cosmeticos... | verca.fialova.2001@gmail.com |
| CZ | 10054620 | The identifier 11380126 is used by Radmila Val... | CZ:Supply Chain Pohořelice 1 Henkel VAS (CZM63... | rvalova1@seznam.cz |
| CZ | 10054728 | The identifier 11805326 is used by Pavel Pecka... | CZ:Supply Chain Pohořelice 3 Levis (CZM630.415... | pavlias000@seznam.cz |
| CZ | 10054699 | The identifier 11380232 is used by Sabina Love... | CZ:Supply Chain Pohořelice 3 Marks and Spencer... | s.loveckova@seznam.cz |
| CZ | 10054727 | The identifier 11805358 is used by Tereza Holč... | CZ:Supply Chain Pohořelice 3 Levis (CZM630.415... | tholcapko@seznam.cz |
(注:看起来你提供的列名可能有点错位——问题里提到要判断Error列的开头,但表格里的Error列是数字,实际错误描述在Department Name列?如果是这样的话,把代码里的df['Error']换成df['Department Name']就行,核心逻辑不变)
回到问题本身,最优的解决方式是用Pandas矢量化字符串操作,相比逐行遍历的方法,这种方式在处理大数据集时效率高得多,也是Pandas官方推荐的做法:
方法1:str.startswith + np.where(最推荐)
这种写法直观且高效,适合你的两种判断场景:
import pandas as pd import numpy as np # 假设你的DataFrame名为df,注意:如果错误文本在其他列,替换成对应的列名,比如df['Department Name'] df['Error Type'] = np.where( # 第一个条件:Error列以"The identifier"开头,case=False可选,用来忽略大小写 df['Error'].str.startswith('The identifier', case=False), 'Duplicated', # 嵌套第二个条件:如果不符合第一个,判断是否以"The data"开头 np.where( df['Error'].str.startswith('The data', case=False), 'Transaction', np.nan # 不符合两种情况的默认值,可改成'Other'之类的自定义值 ) )
方法2:自定义映射函数(适合扩展更多错误类型)
如果之后可能需要新增更多错误类型的判断,你可以先写一个简单的映射函数,再用map或者apply处理:
def determine_error_type(error_msg): if error_msg.startswith('The identifier'): return 'Duplicated' elif error_msg.startswith('The data'): return 'Transaction' else: return np.nan # 默认值 df['Error Type'] = df['Error'].map(determine_error_type)
不过要注意,map本质是逐行处理数据,当你的DataFrame行数很多(比如十万+)时,效率会比第一种矢量化方法低不少,所以优先选第一种。
小提示
- 如果需要忽略大小写判断(比如有些行的错误文本是小写开头),记得给
str.startswith加上case=False参数。 - 对于不满足两种条件的行,默认用
np.nan标记,你可以根据实际需求改成其他值,比如'Uncategorized'。
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

