如何从Pandas DataFrame的字符串列中提取name字段值?已尝试代码未正常工作
解决Pandas提取键值对中name值的问题
嗨,我来帮你搞定这个提取name值的问题~你原来的代码没起作用,核心原因是正则表达式的格式和你的数据不匹配:你写的"'name': '(.*?)'"是针对类似字典的'name': 'x'格式,但你的数据是id=1;name=x;color=blue;这种用分号分隔、键值对用等号连接的结构,自然匹配不到啦😅
下面给你两种实用的解决方案:
方法一:直接用正确的正则提取
针对你的数据格式,我们可以写一个精准匹配name=后面内容的正则,直到遇到分号或者行尾为止:
import pandas as pd # 示例数据 df = pd.DataFrame({'col': ['id=1;name=x;color=blue;', 'id=2;name=y;color=green;']}) # 提取name对应的值 df['name'] = df['col'].str.extract(r'name=([^;]+)')
这里的正则r'name=([^;]+)'解释:
name=:精准匹配键的固定前缀([^;]+):捕获所有不是分号的字符(也就是name对应的值),括号用来标记需要提取的部分
执行后,df的name列就会得到['x', 'y'],完全符合你的需求~
方法二:批量提取所有键值对(适合多字段需求)
如果你之后还需要提取id、color等其他字段,用这种方法更高效:把每行的键值对拆分成字典,再扩展成DataFrame的列:
# 拆分每行的键值对,过滤空元素(因为最后一个分号会产生空字符串) key_value_pairs = df['col'].str.split(';', expand=True).stack() # 拆分每个键值对为键和值 split_pairs = key_value_pairs.str.split('=', expand=True) # 转成宽表格式,得到所有字段的列 result = split_pairs.set_index(0, append=True)[1].unstack(0) # 合并回原DataFrame(可选) df = df.join(result)
这样处理后,df会新增id、name、color三列,一次性搞定所有字段的提取,非常适合有多个键值对需要处理的场景。
小提醒
如果你的数据中存在没有name字段的行,提取后会得到NaN,可以用df['name'].fillna('未知', inplace=True)来填充默认值;如果name的值里可能包含分号(这种情况很少见),那需要调整正则逻辑,比如匹配到下一个键的开头或者行尾。
内容的提问来源于stack exchange,提问作者Mo T
相关产品推荐
相关产品推荐

