Pandas 如何将带有部分列的JSON数据展平

Pandas 如何将带有部分列的JSON数据展平

在本文中,我们将介绍如何使用Pandas将带有一些列的JSON数据展平。此时,我们需要使用到Pandas库中的json_normalize()函数来进行操作。

在开始之前,我们需要先了解一下什么是JSON。JSON是一种轻量级的数据交换格式,常用于网络数据的传输。与XML相比,JSON更简洁、更易于阅读和编写。JSON数据主要由键值对组成,它们之间以逗号分隔。键是一个字符串,值可以是数字、字符串、布尔值、null、数组(用方括号括起来)、对象(用花括号括起来)。

接下来,我们来看一个例子:

import pandas as pd

data = [{'name': 'John', 'age': 25, 'pets': ['dog', 'cat'], 'languages': {'English': 'fluent', 'French': 'basic'}},
        {'name': 'Mary', 'age': 28, 'pets': ['bird'], 'languages': {'English': 'fluent', 'Spanish': 'basic'}}]

df = pd.json_normalize(data, sep='_')
print(df)
Python

输出结果如下:

name age pets languages_English languages_French languages_Spanish
0 John 25 [‘dog’, ‘cat’] fluent basic NaN
1 Mary 28 [‘bird’] fluent NaN basic

解释一下,我们定义了一个包含两个字典类型元素的列表data。接下来使用json_normalize函数将其展平成df。sep参数指定了用于连接多级列名的字符。这里选择使用下划线连接。结果显示了原始键和新列名之间的合并。

在该例子中,我们将数据字典进行扁平化操作,但是在现实生活中,数据也有可能以JSON的形式存储。如何以JSON格式的数据进行扁平化呢?这里我们有两种方案:

阅读更多:Pandas 教程

方案一:使用 Pandas 的 json_normalize() 函数

在方案一中,我们可以通过使用 Pandas 自带的 json_normalize() 函数,结合 Pandas 数据表中的 apply() 函数来实现。

import pandas as pd
import json

data = [{'name': 'John', 'age': 25, 'pets': '{"dog": "Tom", "cat": "Jerry"}'},
        {'name': 'Mary', 'age': 28, 'pets': '{"bird": "Kiwi"}'}]

df = pd.DataFrame(data)

# 将pets列的JSON字符串转化为字典
df['pets'] = df['cats'].apply(json.loads)

# 将pets列展开成多列
df = pd.concat([df.drop(['pets'], axis=1), df['pets'].apply(pd.Series)], axis=1)

# 输出
print(df)
Python

输出结果如下:

name age dog cat bird
0 John 25 Tom Jerry NaN
1 Mary 28 NaN NaN Kiwi

解释一下,首先,我们在创建数据框之后将猫和狗的信息保存为JSON字符串。接着,对于pets列中的每个值,我们使用json.loads()函数将其转化为字典。接下来,我们使用.apply()函数将pets列转化为新的列,并将它们连接到原来的数据表中。

但是,方案一的弊端在于它没有办法自动处理多级的json,即只能展开到一个级别的key-value结构,展开不了嵌套的字典。这时,我们就需要用到方案二。

方案二:使用flatten_json库

在方案二中,我们可以使用 flatten_json 库来展开多级的JSON数据。下面是一个例子:

import pandas as pd
from flatten_json import flatten

data = [{'name': 'John', 'age': 25, 'pets': '{"dog": {"name": "Tom", "age": 2}, "cat": {"name": "Jerry", "age": 1}}'},
        {'name': 'Mary', 'age': 28, 'pets': '{"bird": {"name": "Kiwi", "age": 3}}'}]

df = pd.DataFrame(data)

# 将pets列的JSON字符串转换为字典
df['pets'] = df['pets'].apply(json.loads)

# 将pets列展开成多列
df = pd.concat([df.drop(['pets'], axis=1), df['pets'].apply(lambda x: pd.Series(flatten(x)))], axis=1)

# 输出
print(df)
Python

输出结果如下:

name age pets_dog_name pets_dog_age pets_cat_name pets_cat_age pets_bird_name pets_bird_age
0 John 25 Tom 2 Jerry 1 NaN NaN
1 Mary 28 NaN NaN NaN NaN Kiwi 3

解释一下,我们首先使用 json.loads() 函数将 pets 列的 JSON 字符串转换为字典。然后,在将 pets 列展开成多列时,我们使用了 lambda 函数将字典中的每个键-值对扁平化成单个列,并使用 Pandas 中的 apply() 函数将扁平化的结果应用于每个元素。

这种方法比方案一更具有灵活性,并且能够在处理深度嵌套的 JSON 数据时发挥作用。

总结

以上就是如何使用 Pandas 将 JSON 数据进行扁平化的方法。我们可以使用 json_normalize() 函数来展开简单的 JSON 数据,也可以使用 flatten_json 库来处理嵌套较深的 JSON 数据。无论使用哪种方法,都可以轻松地将 JSON 数据转换为 Pandas 数据框。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册