如何在DataFrame的元组列表中通过列表推导式提取指定位置字符串
从DataFrame的字符串型元组列表中提取元素
问题背景
现有如下DataFrame,col列中的内容是字符串形式的元组列表:
import pandas as pd df = {'col':[ "[('affect', 'the risks')]", "[('have', 'we'), ('breached', 'our systems'), ('cease', 'our computer'), ('suffer', ''), ('allow', ''), ('damage', 'misappropriation'), ('require', 'proprietary'), ('incur', 'us'), ('remediate', 'us'), ('resolve', 'us')]"]} df = pd.DataFrame(df)
需要提取每个元组的第1个(索引0)和第2个(索引1)元素,分别生成item0和item1列,期望输出格式如下:
# item0列内容 0 'affect' 1 'have', 'breached', 'cease', 'suffer', 'allow', 'damage', 'require', 'incur', 'remediate', 'resolve' Name: item0, dtype: object # item1列内容 0 'the risks' 1 'we', 'our systems', 'our computer', '', 'misappropriation', 'proprietary', 'us', 'us', 'us' Name: item1, dtype: object
解决方案
实现思路
- 解析字符串为Python对象:先用
ast.literal_eval()将col列的字符串内容转换成真实的元组列表(安全替代eval(),避免执行恶意代码)。 - 用zip()解包提取元素:利用
zip(*x)将元组列表解包为两个元素序列,分别对应所有元组的索引0和索引1元素。 - 拼接成目标字符串:遍历元素序列,给非空元素添加引号,再用逗号连接成符合要求的格式。
完整代码
import pandas as pd import ast # 初始化原DataFrame df = {'col':[ "[('affect', 'the risks')]", "[('have', 'we'), ('breached', 'our systems'), ('cease', 'our computer'), ('suffer', ''), ('allow', ''), ('damage', 'misappropriation'), ('require', 'proprietary'), ('incur', 'us'), ('remediate', 'us'), ('resolve', 'us')]"]} df = pd.DataFrame(df) # 解析字符串为元组列表 df['parsed_col'] = df['col'].apply(ast.literal_eval) # 生成item0列:用zip()提取所有元组的索引0元素,拼接成字符串 df['item0'] = df['parsed_col'].apply( lambda x: ", ".join([f"'{item}'" if item else "" for item in zip(*x)[0]]) ) # 生成item1列:用zip()提取所有元组的索引1元素,拼接成字符串 df['item1'] = df['parsed_col'].apply( lambda x: ", ".join([f"'{item}'" if item else "" for item in zip(*x)[1]]) ) # 输出目标结果 result_df = df[['item0', 'item1']] print(result_df)
关键说明
ast.literal_eval():专门用于解析字符串形式的Python内置数据类型(列表、元组、字典等),比eval()更安全。zip(*x):将元组列表x解包,把每个元组的对应位置元素聚合为独立序列,比如zip(*[(a,b),(c,d)])会得到(a,c)和(b,d)两个元组,正好对应我们需要的索引0和索引1元素集合。
内容的提问来源于stack exchange,提问作者hilo
相关产品推荐
相关产品推荐

