Pandas JSON 东方自动检测

Ric*_*ckD 6 python json pandas

我试图找出 Pandas.read_json 是否执行某种程度的自动检测。例如,我有以下数据:

data_records = [
    {
        "device": "rtr1",
        "dc": "London",
        "vendor": "Cisco",
    },
    {
        "device": "rtr2",
        "dc": "London",
        "vendor": "Cisco",
    },
    {
        "device": "rtr3",
        "dc": "London",
        "vendor": "Cisco",
    },
]

data_index = {
    "rtr1": {"dc": "London", "vendor": "Cisco"},
    "rtr2": {"dc": "London", "vendor": "Cisco"},
    "rtr3": {"dc": "London", "vendor": "Cisco"},
}
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:

import pandas as pd
import json

pd.read_json(json.dumps(data_records))
---
  device      dc vendor
0   rtr1  London  Cisco
1   rtr2  London  Cisco
2   rtr3  London  Cisco
Run Code Online (Sandbox Code Playgroud)

虽然我得到了我想要的输出,但数据是基于记录的。既然是默认的orient是列,我不认为这会起作用。

因此是否存在一定程度的自动检测?使用基于索引的输入,行为似乎更加内联。如图所示,默认情况下似乎已根据列方向解析数据。

pd.read_json(json.dumps(data_index))

          rtr1    rtr2    rtr3
dc      London  London  London
vendor   Cisco   Cisco   Cisco

pd.read_json(json.dumps(data_index), orient="index")

          dc vendor
rtr1  London  Cisco
rtr2  London  Cisco
rtr3  London  Cisco
Run Code Online (Sandbox Code Playgroud)

Eri*_*bel 2

长话短说

当使用pd.read_json()with时orient=None,数据的表示形式是通过 自动确定的pd.DataFrame()

解释

pandas 文档在这里有点误导。当未指定时orient,将使用“列”的解析器,即self.obj = pd.DataFrame(json.loads(json))。所以

pd.read_json(json.dumps(data_records))
Run Code Online (Sandbox Code Playgroud)

相当于

pd.DataFrame(json.loads(json.dumps(data_records)))
Run Code Online (Sandbox Code Playgroud)

这又相当于

pd.DataFrame(data_records)
Run Code Online (Sandbox Code Playgroud)

即,将字典列表传递给 DataFrame 构造函数,然后该构造函数执行数据表示的自动确定。请注意,这并不意味着orient会自动检测到。相反,应用关于如何将数据加载到 DataFrame 的简单启发式方法(见下文)。

通过加载类似 JSON 的数据pd.DataFrame()

对于 JSON 结构数据的 3 个最相关的情况,DataFrame 的构建方式pd.DataFrame()是:

  1. 列表字典
In[1]: data = {"a": [1, 2, 3], "b": [9, 8, 7]}
  ...: pd.DataFrame(data)
Out[1]: 
   a  b
0  1  9
1  2  8
2  3  7
Run Code Online (Sandbox Code Playgroud)
  1. 字典中的字典
In[2]: data = {"a": {"x": 1, "y": 2, "z": 3}, "b": {"x": 9, "y": 8, "z": 7}}
  ...: pd.DataFrame(data)
Out[2]: 
   a  b
x  1  9
y  2  8
z  3  7
Run Code Online (Sandbox Code Playgroud)
  1. 字典列表
In[3]: data = [{'a': 1, 'b': 9}, {'a': 2, 'b': 8}, {'a': 3, 'b': 7}]
  ...: pd.DataFrame(data)
Out[3]: 
   a  b
0  1  9
1  2  8
2  3  7
Run Code Online (Sandbox Code Playgroud)