从Pandas DataFrame提取嵌套JSON字段的技术咨询
从Pandas DataFrame提取嵌套JSON字段(Twitter数据场景)
我来帮你搞定从Pandas DataFrame里提取嵌套JSON字段的问题,结合你用Tweepy+jsonpickle生成Twitter数据的场景,给你几个实用的方案:
第一步:加载jsonpickle生成的JSON数据到DataFrame
因为jsonpickle序列化的内容不是标准JSON,得先反序列化再转成DataFrame:
import jsonpickle import pandas as pd # 读取你的Twitter数据文件 with open('twitter_data.json', 'r') as f: # 用jsonpickle反序列化内容 deserialized_data = jsonpickle.decode(f.read()) # 转成Pandas DataFrame df = pd.DataFrame(deserialized_data)
方法1:用apply+Lambda提取单层嵌套字段
如果只是提取单层嵌套的简单字段(比如推文作者的昵称),这种方法直接高效:
# 提取用户昵称(从嵌套的user字段里取screen_name) df['author_username'] = df['user'].apply(lambda x: x['screen_name']) # 处理可能为空的嵌套字段(比如转发推文的点赞数) df['retweet_likes'] = df['retweeted_status'].apply(lambda x: x['favorite_count'] if x is not None else 0)
方法2:用pd.json_normalize扁平化复杂嵌套结构
Twitter数据里的user、entities都是多层嵌套的结构,json_normalize能直接把嵌套字段拆成单独的列,非常省心:
# 直接把整个反序列化后的数据集展平成DataFrame flattened_df = pd.json_normalize(deserialized_data) # 如果已经有原始DataFrame,也可以单独展平某一列 # 比如展平user列的所有子字段 user_details = pd.json_normalize(df['user']) # 把展平后的用户信息和原DataFrame合并,同时删掉原来的user列 df = pd.concat([df.drop('user', axis=1), user_details], axis=1)
展平后你会得到类似user.id、user.location、entities.hashtags这样的列名,直接就能用。
方法3:处理数组类型的深层嵌套字段
比如推文里的话题标签(entities.hashtags)是数组嵌套,要提取里面的内容可以这么做:
# 把所有话题标签转成逗号分隔的字符串 df['hashtags'] = df['entities'].apply(lambda x: ','.join([tag['text'] for tag in x['hashtags']]) if x['hashtags'] else None) # 如果想把每个话题标签拆成单独的行,用explode df_hashtags = df.explode('hashtags')
小提醒
- 一定要处理空值:有些推文可能没有转发内容、话题标签这类字段,所以在
apply里加个判断(比如if x is not None),避免报错。 - jsonpickle的坑:别直接用
pd.read_json()读取jsonpickle生成的文件,必须用jsonpickle.decode()先反序列化。
内容的提问来源于stack exchange,提问作者Rahul Agarwal
相关产品推荐
相关产品推荐

