如何让Pandas将JSON数据解压缩到正确的DataFrame而不是dicts列表

时间:2017-06-07 16:44:06

标签: python pandas

我正在尝试将http://dev.hsl.fi/tmp/citybikes/stations_20170503T071501Z的数据解析为Pandas DataFrame。使用read_json为我提供了一个dicts列表,而不是一个正确的DataFrame,变量名称为列:

In [1]:

data = pd.read_json("http://dev.hsl.fi/tmp/citybikes/stations_20170503T071501Z")
print(data)

Out[1]:

                                                result
0    {'name': '001 Kaivopuisto', 'coordinates': '60...
1    {'name': '002 Laivasillankatu', 'coordinates':...
..                                                 ...
149  {'name': '160 Nokkala', 'coordinates': '60.147...
150  {'name': '997 Workshop Helsinki', 'coordinates...

[151 rows x 1 columns]

所有orient选项都会发生这种情况。我试过json_normalize()无效,还有其他一些我在这里找到的东西。我怎么能把它变成一个合理的DataFrame?谢谢!

1 个答案:

答案 0 :(得分:5)

选项1
在词典列表中使用pd.DataFrame

pd.DataFrame(data['result'].values.tolist())

   avl_bikes          coordinates  free_slots                    name  operative style  total_slots
0         12  60.155411,24.950391          18         001 Kaivopuisto       True    CB           30
1          3  60.159715,24.955212           9     002 Laivasillankatu       True                 12
2          0  60.158172,24.944808          16  003 Kapteeninpuistikko       True                 16
3          0  60.160944,24.941859          14           004 Viiskulma       True                 14
4         16  60.157935,24.936083          16           005 Sepänkatu       True                 32

选项2
使用apply

data.result.apply(pd.Series)

   avl_bikes          coordinates  free_slots                    name  operative style  total_slots
0         12  60.155411,24.950391          18         001 Kaivopuisto       True    CB           30
1          3  60.159715,24.955212           9     002 Laivasillankatu       True                 12
2          0  60.158172,24.944808          16  003 Kapteeninpuistikko       True                 16
3          0  60.160944,24.941859          14           004 Viiskulma       True                 14
4         16  60.157935,24.936083          16           005 Sepänkatu       True                 32

选项3
或者您可以自己获取json并删除results

import urllib, json
url = "http://dev.hsl.fi/tmp/citybikes/stations_20170503T071501Z"
response = urllib.request.urlopen(url)
data = json.loads(response.read())

df = pd.DataFrame(data['result'])
df

   avl_bikes          coordinates  free_slots                    name  operative style  total_slots
0         12  60.155411,24.950391          18         001 Kaivopuisto       True    CB           30
1          3  60.159715,24.955212           9     002 Laivasillankatu       True                 12
2          0  60.158172,24.944808          16  003 Kapteeninpuistikko       True                 16
3          0  60.160944,24.941859          14           004 Viiskulma       True                 14
4         16  60.157935,24.936083          16           005 Sepänkatu       True                 32