Pandas 读写json

  • Post category:Python

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文件的攻略就讲解完毕了。