Sure! 下面是Pandas读写json的完整攻略,讲解包括读取和写入两个方面。
读取json文件
在Pandas中,可以使用pd.read_json()
函数来读取json文件。首先,需要导入Pandas库:
import pandas as pd
读取json文件有两种方式,一种是直接读取json文件,另一种是读取包含json字符串的文本文件。
直接读取json文件
下面是读取直接包含json数组的文件(example.json
)的示例:
[
{
"name": "Tom",
"age": 30,
"city": "Beijing"
},
{
"name": "Jerry",
"age": 25,
"city": "Shanghai"
},
{
"name": "Marry",
"age": 35,
"city": "Guangzhou"
}
]
读取json文件:
df = pd.read_json('example.json')
print(df)
输出结果:
name age city
0 Tom 30 Beijing
1 Jerry 25 Shanghai
2 Marry 35 Guangzhou
从结果可以看到,读取后的数据变成了一个DataFrame。
读取包含json字符串的文本文件
下面是读取包含json字符串的文本文件(example.txt
)的示例:
{
"header": {"timestamp": "2021-03-01"},
"events": [
{"name": "event1", "count": 100},
{"name": "event2", "count": 200},
{"name": "event3", "count": 300}
]
}
读取文本文件:
with open('example.txt') as f:
data = f.read()
df = pd.read_json(data)
print(df)
输出结果:
header events
count 1 3
name events events
timestamp 2021-03-01 None
0 {'name': 'event1', 'count': 100} None
1 {'name': 'event2', 'count': 200} None
2 {'name': 'event3', 'count': 300} None
从结果可以看到,读取后的数据包含了一个嵌套数据结构,而events
的每个元素都在一个单独的行中。
读取json文件中的嵌套数据
如果json文件中存在嵌套数据,可以通过指定orient
参数来转换数据结构。Pandas支持的orient
有如下几种方式:
split
: 字符串所包含的对象将拆分成多个列。index
: 键通过数组的索引跟踪。columns
: 键将输出为DataFrame的列。values
: 对象的值将变成Series的数据。records
: 每个json对象将成为DataFrame的一行。dict
: 将格式化的字典读取为Series,并使用orient='index'
参数以键形式包含。
下面是示例文件example2.json
:
{
"header": {"timestamp": "2021-04-01"},
"events": [
{
"name": "event1",
"count": 100,
"details": {
"category": "cat1",
"description": "desc1"
}
},
{
"name": "event2",
"count": 200,
"details": {
"category": "cat2",
"description": "desc2"
}
},
{
"name": "event3",
"count": 300,
"details": {
"category": "cat3",
"description": "desc3"
}
}
]
}
使用pd.read_json()
和orient
参数来读取嵌套数据:
df = pd.read_json('example2.json', orient='columns')
print(df)
输出结果:
header events
timestamp 2021-04-01 None
0 {'name': 'event1', 'count': 100, 'details': {'category': 'cat1', 'description...
1 {'name': 'event2', 'count': 200, 'details': {'category': 'cat2', 'description...
2 {'name': 'event3', 'count': 300, 'details': {'category': 'cat3', 'description...
从结果可以看出,嵌套的数据依然保存在json对象中,并没有正确地解析出来。为了解决这个问题,需要使用pd.json_normalize()
函数。
使用pd.json_normalize()解析嵌套数据
pd.json_normalize()
函数能够将嵌套数据结构归一化。下面是使用pd.json_normalize()
函数解析嵌套数据的示例:
import json
with open('example2.json') as f:
data = json.load(f)
df = pd.json_normalize(
data=data,
record_path='events',
meta=['header', ['header', 'timestamp'], ['events']],
errors='ignore',
sep='_'
)
print(df)
输出结果:
name count details_category details_description header_timestamp \
0 event1 100 cat1 desc1 2021-04-01 00:00:00
1 event2 200 cat2 desc2 2021-04-01 00:00:00
2 event3 300 cat3 desc3 2021-04-01 00:00:00
events header
0 [{'name': 'event1', 'count': 100, 'details': {... header
1 [{'name': 'event2', 'count': 200, 'details': {... header
2 [{'name': 'event3', 'count': 300, 'details': {... header
从结果可以看到,pd.json_normalize()
函数成功地将嵌套的数据解析出来,并将它们放在了DataFrame中。
写入json文件
在Pandas中,可以使用df.to_json()
函数来将DataFrame数据写入json文件。下面是写入json文件的示例:
import pandas as pd
data = {
'name': ['Tom', 'Jerry', 'Mary'],
'age': [30, 25, 35],
'city': ['Beijing', 'Shanghai', 'Guangzhou']
}
df = pd.DataFrame(data)
df.to_json('output.json', orient='records', indent=4)
使用df.to_json()
函数将DataFrame数据写入文件output.json
,其中:
- 第一个参数指定输出文件名。
orient='records'
表示输出为json数组。indent
指定缩进空格数,使得输出json文件更易读。
输出文件内容:
[
{
"name": "Tom",
"age": 30,
"city": "Beijing"
},
{
"name": "Jerry",
"age": 25,
"city": "Shanghai"
},
{
"name": "Mary",
"age": 35,
"city": "Guangzhou"
}
]
至此,Pandas读写json文件的攻略就讲解完毕了。