如何将Twitter API采集的引用推文列表字典转为pandas DataFrame列
列拆分实现方案
你遇到的TypeError: string indices must be integers报错,核心原因是Referenced_tweets列存储的是字符串格式的字典列表,并非Python原生的列表/字典对象,直接调用json_normalize处理字符串会触发该报错。
完整实现代码
import pandas as pd import ast # 此处替换为你自己的原始数据集读取逻辑,例如读csv的话用pd.read_csv(xxx) # df = pd.read_csv("你的推文数据文件路径") # 1. 将字符串格式的引用数据转为Python原生列表字典对象 df['Referenced_tweets'] = df['Referenced_tweets'].apply(ast.literal_eval) # 2. 定义引用ID提取函数 def extract_reference_id(ref_list): # 初始化三个目标列默认值为空 result = { "replied_to": "", "quoted": "", "retweeted": "" } ref_type_map = {item["type"]: item["id"] for item in ref_list} result.update(ref_type_map) return pd.Series(result) # 3. 应用函数生成三个新列 df[["replied_to", "quoted", "retweeted"]] = df["Referenced_tweets"].apply(extract_reference_id) # 可选:删除原始引用列 # df = df.drop("Referenced_tweets", axis=1)
补充说明
- 用
ast.literal_eval转换字符串格式的结构化数据,比直接用eval更安全,不会执行恶意代码 - 如果单条数据存在多个同类型的引用,代码会默认保留最后出现的对应类型ID,完全匹配你给出的样例输出逻辑
- 不需要额外调用
json_normalize,逻辑更简单可控 - 如果你的数据里存在空值的
Referenced_tweets,可以将转换代码修改为:
df['Referenced_tweets'] = df['Referenced_tweets'].apply(lambda x: ast.literal_eval(x) if pd.notna(x) else [])
内容的提问来源于stack exchange,提问作者Michael S Kim
相关产品推荐
相关产品推荐

