首页 > 解决方案 > 清理 pandas 数据框中的多个 JSON

问题描述

我创建了一个如下所示的数据框,国家/地区采用 JSON 格式:

df = pd.DataFrame([['matt', '''[{"c_id": "cn", "c_name": "China"}, {"c_id": "au", "c_name": "Australia"}]'''],
                   ['david', '''[{"c_id": "jp", "c_name": "Japan"}, {"c_id": "cn", "c_name": "China"},{"c_id": "au", "c_name": "Australia"}]'''],
                   ['john', '''[{"c_id": "br", "c_name": "Brazil"}, {"c_id": "ag", "c_name": "Argentina"}]''']],
                  columns =['person','countries']) 

我想得到如下输出,只有国家名称,用逗号分隔并按字母顺序排序:

result = pd.DataFrame([['matt', 'Australia, China'],
                   ['david', 'Australia, China, Japan'],
                   ['john', 'Argentina, Brazil']],
                  columns =['person','countries']) 

我尝试使用几种方法来做到这一点,但没有一个成功。我希望下面的内容能够适当地拆分 JSON 格式,但它没有成功 - 可能是因为 JSON 在数据帧中是字符串格式?

result = pd.io.json.json_normalize(df, 'c_name')

标签: pythonjsonpandas

解决方案


一种解决方案是将ast.literal_eval字符串视为字典列表:

import ast

df["countries"] = df["countries"].map(lambda x: ast.literal_eval(x))
df["countries"] = df["countries"].map(lambda x: sorted([c["c_name"] for c in x]))

推荐阅读