Python Pandas - 扁平化嵌套的JSON
在处理后端API等数据时,有时会遇到嵌套的JSON数据结构,为了更好地处理这些数据,我们需要对这些嵌套的JSON进行扁平化处理。本文将介绍使用Python Pandas对嵌套的JSON数据进行扁平化处理的方法。
数据来源
我们使用一组来自kaggle的数据进行示范,数据集下载地址如下:
https://www.kaggle.com/c/word2vec-nlp-tutorial/data
下载后可以看到train.json文件,此文件包含多条嵌套的JSON数据,其中每一条JSON数据有以下结构:
{
"id": id_number,
"cuisine": cuisine_name,
"ingredients": [
ingredient1,
ingredient2,
...
]
}
导入Python Pandas
在处理嵌套的JSON数据前,首先需要导入Python Pandas库。安装方式可以使用pip install pandas进行安装。
import pandas as pd
加载JSON数据
我们可以使用Python Pandas库提供的read_json方法读取JSON数据,传入JSON数据文件的路径即可。由于我们读取的是多条JSON数据,因此需要使用orient='records'参数,指明读取的JSON数据是以行的形式记录的。
df = pd.read_json('train.json', orient='records')
扁平化处理
使用Python Pandas提供的apply方法,结合lambda表达式,我们可以逐层递归地遍历每个JSON数据,将嵌套的JSON数据结构扁平化。我们可以先定义一个辅助方法flatten,并在apply方法中调用此方法。
def flatten(d, parent_key='', sep='_'):
"""
将嵌套的JSON数据结构扁平化
"""
items = []
for k, v in d.items():
new_key = parent_key + sep + k if parent_key else k
if isinstance(v, MutableMapping):
items.extend(flatten(v, new_key, sep=sep).items())
elif isinstance(v, Iterable) and not isinstance(v, str):
for i, sub_v in enumerate(v):
items.extend(flatten({str(i): sub_v}, new_key, sep=sep).items())
else:
items.append((new_key, v))
return dict(items)
df_flat = pd.DataFrame(df['ingredients'].apply(lambda x: flatten({str(i): ingredient for i, ingredient in enumerate(x)})).tolist(), index=df.index)
df_flat['id'] = df['id']
df_flat['cuisine'] = df['cuisine']
在这里我们使用了递归的方式遍历了嵌套的JSON数据结构并进行了扁平化处理,最终得到了一个扁平化的DataFrame对象df_flat。
结果
我们将得到扁平化的DataFrame对象df_flat保存到CSV文件中,方便后续的使用。
df_flat.to_csv('train_flatten.csv', index=False)
至此,我们已经介绍了使用Python Pandas对嵌套的JSON数据进行扁平化的方法,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Pandas – 扁平化嵌套的JSON - Python技术站