JSON到熊猫:有更优雅的解决方案吗?

时间:2015-02-27 01:04:02

标签: python json pandas

我有一些从API调用返回的JSON,看起来像这样:

{
    "result": {
        "code": "OK",
        "msg": ""
    },
    "report_name": "FAMOUS_DICTATORS",
    "columns": [
        "rank",
        "name",
        "deaths"
    ],
    "data": [
        {
            "row": [
                1,
                "Mao Zedong",
                63000000
            ]
        },
        {
            "row": [
                2,
                "Jozef Stalin",
                23000000
            ]
        }
    ]
}

我想将JSON转换为Pandas DataFrame:

rank    name            deaths
1       Mao Zedong      63000000
2       Jozef Stalin    23000000

我写了这个并且它有效,但看起来有点难看:

import pandas as pd
import json

columns = eval(r.content)['columns']

df = pd.DataFrame(columns = eval(r.content)['columns'])

for row in eval(r.content)['data']:
    df.loc[len(df)+1] = row['row']

是否有更优雅/ Pythonic的方法(例如可能使用pandas.io.json.read_json)?

2 个答案:

答案 0 :(得分:2)

read_json的{​​{1}}函数是一种非常棘手的使用方法。如果你不确定JSON对象的有效性或者它的初始结构是否足够健全以构建数据框架,那么坚持使用经过试验和测试的方法将数据分解为pandas可以毫无问题地使用的东西。

在您的情况下,我建议将您的数据分解为列表列表。在所有JSON中,您真正需要的唯一部分是pandasdata键。

试试这个:

column

这给了我想要的结果:

import pandas as pd
import json
import urllib

js = json.loads(urllib.urlopen("test.json").read())
data = js["data"]
rows = [row["row"] for row in data] # Transform the 'row' keys to list of lists.
df = pd.DataFrame(rows, columns=js["columns"])
print df

答案 1 :(得分:0)

请参阅pandas.io.json.read_json(path_or_buf =无,orient = None,typ ='frame',dtype = True,convert_axes = True,convert_dates = True,keep_default_dates = True,numpy = False,precise_float = False, date_unit相同=无

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.json.read_json.html