如何在Telegram导出JSON数据中扁平化嵌套text字段?
Telegram导出JSON文本字段扁平化方案
针对Telegram导出JSON数据中text字段同时存在字符串和嵌套列表的情况,可通过以下步骤实现扁平化拆分:
统一文本格式为列表
将单一字符串格式的text转为单元素列表,确保所有text内容都是列表结构,方便后续处理:df['text_list'] = df['messages'].apply( lambda msg: [msg['text']] if isinstance(msg['text'], str) else msg['text'] )提取列表元素的纯文本
遍历列表中的每个元素:如果是字典则提取text值,如果是字符串直接保留:df['clean_text'] = df['text_list'].apply( lambda lst: [item['text'] if isinstance(item, dict) else item for item in lst] )拆分列表为独立行
使用Pandas的explode方法将列表中的每个元素拆分为单独一行,同时重置索引:df_flattened = df.explode('clean_text').reset_index(drop=True)
完整示例代码
import pandas as pd # 读取Telegram导出的JSON为DataFrame(示例) df = pd.read_json('telegram_export.json') # 处理text字段并扁平化 df['text_list'] = df['messages'].apply( lambda msg: [msg['text']] if isinstance(msg['text'], str) else msg['text'] ) df['clean_text'] = df['text_list'].apply( lambda lst: [item['text'] if isinstance(item, dict) else item for item in lst] ) df_flattened = df.explode('clean_text').reset_index(drop=True) # 按需保留原数据中的其他字段(如发送日期、发送者等) final_df = df_flattened[['date', 'from', 'clean_text']]
注意事项
- 如果你的DataFrame中text是直接作为列存在(而非嵌套在
messages字典里),只需将代码中的msg['text']替换为msg即可。 - 若字典中除
text外还有其他需要保留的字段(如type),可修改提取逻辑,比如同时保留type和text:df['clean_text'] = df['text_list'].apply( lambda lst: [{'type': item.get('type'), 'text': item['text']} if isinstance(item, dict) else {'type': 'text', 'text': item} for item in lst] )
内容的提问来源于stack exchange,提问作者us817263fa
相关产品推荐
相关产品推荐

