如何在Pandas DataFrame中提取字符串型键值对的首组键与值
Pandas提取字符串中第一组键值对解决方案
问题说明
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({'col_1': ['1', '2', '3', '4'], 'col_2': ['a:b,c:d', ':v', 'w:,x:y', 'f:g,h:i,j:'] })
需要从col_2的字符串中提取第一组键值对,分别存入col_3(键)和col_4(值),得到期望输出:
pd.DataFrame({'col_1': ['1', '2', '3', '4'], 'col_2': ['a:b,c:d', ':v', 'w:,x:y', 'f:g,h:i,j:'], 'col_3': ['a','','w','f'], 'col_4': ['b','v','','g'] })
原代码问题
你之前的代码直接对整个字符串按冒号分割,会把所有冒号都拆分,比如'a:b,c:d'会被分成['a', 'b,c', 'd'],取索引1得到的是'b,c',不符合只取第一组的需求。
可行解决方案
方法1:用Pandas字符串方法(高效推荐)
先按逗号拆分取第一组,再按冒号拆分键和值,用fillna('')处理空值情况:
# 提取逗号分隔的第一组键值对 first_kv = df['col_2'].str.split(',').str[0] # 拆分键到col_3 df['col_3'] = first_kv.str.split(':').str[0] # 拆分值到col_4,空值填充为'' df['col_4'] = first_kv.str.split(':').str[1].fillna('')
方法2:自定义函数+apply(灵活适配特殊场景)
如果需要处理值中包含冒号的情况,用split(':', 1)只拆分一次:
def get_first_key_value(s): # 取第一组键值对 first_part = s.split(',')[0] # 只按第一个冒号拆分 parts = first_part.split(':', 1) # 处理拆分后的长度,确保键值都有值(空字符串) key = parts[0] if len(parts) >= 1 else '' value = parts[1] if len(parts) >= 2 else '' return key, value # 应用函数并展开为两列 df[['col_3', 'col_4']] = df['col_2'].apply(lambda x: pd.Series(get_first_key_value(x)))
验证结果
运行上述任意一种方法后,输出结果与期望一致:
col_1 col_2 col_3 col_4 0 1 a:b,c:d a b 1 2 :v v 2 3 w:,x:y w 3 4 f:g,h:i,j: f g
内容的提问来源于stack exchange,提问作者Aayush Gupta
相关产品推荐
相关产品推荐

