如何扁平化Pandas DataFrame中含JSON格式的列?
解决方案:将Pandas DataFrame中的JSON数组列转为逗号分隔字符串
核心思路
json_normalize的作用是将JSON数组展开为多行记录,但你的需求是将数组内的tag值合并为单个逗号分隔的字符串列,因此需要改用apply结合字符串拼接的方式实现。
分场景实现
场景1:目标列是JSON格式字符串
如果tweet_hashtag和tweet_cashtag存储的是未解析的JSON字符串,先解析为Python列表,再提取tag并拼接:
import pandas as pd import json # 模拟你的原始DataFrame df = pd.DataFrame({ 'created_at': ['2024-01-01', '2024-01-02'], 'tweet_hashtag': [ '[{"tag": "Python"}, {"tag": "DataScience"}]', '[{"tag": "Pandas"}, {"tag": "ML"}]' ], 'tweet_cashtag': [ '[{"tag": "AAPL"}, {"tag": "GOOGL"}]', '[]' ] }) # 定义转换函数:解析JSON并拼接tag def parse_and_join_tags(json_str): try: tag_list = json.loads(json_str) return ','.join(item['tag'] for item in tag_list) except (json.JSONDecodeError, KeyError): return '' # 处理解析失败或空数组的情况 # 应用转换到目标列 df['tweet_hashtag'] = df['tweet_hashtag'].apply(parse_and_join_tags) df['tweet_cashtag'] = df['tweet_cashtag'].apply(parse_and_join_tags) # 查看最终结果 print(df)
场景2:目标列已解析为Python列表
如果列数据已经是Python列表格式(比如提前用json.loads批量解析过),直接提取tag拼接即可:
import pandas as pd # 模拟已解析列表格式的DataFrame df = pd.DataFrame({ 'created_at': ['2024-01-01', '2024-01-02'], 'tweet_hashtag': [ [{'tag': 'Python'}, {'tag': 'DataScience'}], [{'tag': 'Pandas'}, {'tag': 'ML'}] ], 'tweet_cashtag': [ [{'tag': 'AAPL'}, {'tag': 'GOOGL'}], [] ] }) # 直接拼接tag值 df['tweet_hashtag'] = df['tweet_hashtag'].apply(lambda x: ','.join(item['tag'] for item in x)) df['tweet_cashtag'] = df['tweet_cashtag'].apply(lambda x: ','.join(item['tag'] for item in x)) # 查看最终结果 print(df)
关键说明
json_normalize不适用的原因:它会把每个数组元素拆分为单独的行,而不是将元素合并到同一行的字符串中,与你的需求方向不符。
内容的提问来源于stack exchange,提问作者tiktak
相关产品推荐
相关产品推荐

