如何基于字符串匹配为Pandas DataFrame创建新列?
Pandas DataFrame 多列生成解决方案
原始数据
import pandas as pd df = pd.DataFrame({'col1': {0: 'success', 1: 'failed', 2: 'variable x 10', 3: 'variable xr 134', 4: 'error', 5: 'not found'}})
错误原因解析
你遇到的两个问题根源:
str.contains中用|连接字符串报错:|是Python位运算符,不能直接拼接字符串,需将关键词整合成正则表达式字符串或使用正确的参数传递方式。- 取split后元素报错:直接全局拆分字符串时,部分行拆分结果长度不足,导致形状不匹配,需仅对符合条件的行执行拆分操作。
可行解决方案
以下是完全符合规则的代码:
# 初始化新列为None df['var'] = None df['val'] = None df['other'] = None # 处理包含'variable'的行,生成var和val列 mask_variable = df['col1'].str.contains('variable', regex=False) # 拆分符合条件的行并转为DataFrame split_result = df.loc[mask_variable, 'col1'].str.split(expand=True) # 按索引取对应元素赋值 df.loc[mask_variable, 'var'] = split_result[1] df.loc[mask_variable, 'val'] = split_result[2] # 处理other列的映射关系 other_map = { 'success': 'Success', 'failed': 'Fail', 'error': 'Error', 'not found': 'Error' } # 批量映射,不匹配的行自动保留None df['other'] = df['col1'].map(other_map)
代码说明
- 初始化新列:先将三个新列设为
None,满足无匹配时的默认值要求。 - 生成var/val列:
- 用
str.contains生成布尔掩码,精准筛选包含'variable'的行(关闭正则避免特殊字符干扰)。 - 用
str.split(expand=True)将目标行拆分为多列DataFrame,直接通过索引取第2、3个元素(Python索引从0开始)。 - 通过掩码定位行,完成赋值操作。
- 用
- 生成other列:
- 定义映射字典,将原始字符串与目标值一一对应。
- 使用
map()方法批量替换,未匹配的行自动保留None。
最终结果
处理后的DataFrame如下:
| col1 | var | val | other | |
|---|---|---|---|---|
| 0 | success | None | None | Success |
| 1 | failed | None | None | Fail |
| 2 | variable x 10 | x | 10 | None |
| 3 | variable xr 134 | xr | 134 | None |
| 4 | error | None | None | Error |
| 5 | not found | None | None | Error |
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

