2017-04-27 32 views
2

我有一个天气API JSON数据。 我从网站得到了再转换Python字典JSON到Python数据框

markit_dict = json.loads(response.content) 
markit_dict 

然后我翻了一个数据帧

enter image description here

但你可以看到天气列需要分开3分不同的列

时我选择每列可以打开数据帧我可以

wh = pd.DataFrame(openwet.iloc[1,6]) 
wh 

    description  icon id main 
0 broken clouds 04d 803 Clouds 

我最后一次试图把在for循环中,使数据帧,但我不能

编辑:

openwet = pd.DataFrame(markit_dict) 
openwet['weather'].values 

输出:

array([ [{u'main': u'Clouds', u'id': 803, u'icon': u'04d', u'description': u'broken clouds'}], 
     [{u'main': u'Clouds', u'id': 803, u'icon': u'04d', u'description': u'broken clouds'}], 
     [{u'main': u'Clouds', u'id': 804, u'icon': u'04d', u'description': u'overcast clouds'}], 
     [{u'main': u'Clouds', u'id': 804, u'icon': u'04d', u'description': u'overcast clouds'}], 

我需要做一个数据帧天气栏。另外我把我的JSON数据可能是有人可以找到不同的方式。

url = "http://history.openweathermap.org//storage/debd7a72617dd61b0fc871a2c83fcabf.json" 
response = requests.get(url) 

response.content 
+0

你需要使用分层/多索引它。它会工作。请参阅[docs](http://pandas.pydata.org/pandas-docs/stable/advanced.html)。 – Jeril

+0

嘿@Jeril不幸的是我无法使用。我如何使用你尝试过吗? – Axis

+0

你能分享一段你的数据吗? – Jeril

回答

3

我认为你需要json_normalize用于创建DataFrame和列weather先用str[0]选择列表,然后通过values转换为numpy array再到DataFrame。 (如果需要重命名列名可能加入add_prefix)最后concat原始:

import urllib.request, json 

url = "http://history.openweathermap.org//storage/debd7a72617dd61b0fc871a2c83fcabf.json" 
#http://stackoverflow.com/a/12965254/2901002 
with urllib.request.urlopen(url) as url: 
    data = json.loads(url.read().decode()) 

from pandas.io.json import json_normalize  
df = json_normalize(data) 
df1 = pd.DataFrame(df['weather'].str[0].values.tolist()).add_prefix('weather.') 
print (df1.head()) 
    weather.description weather.icon weather.id weather.main 
0  broken clouds   04d   803  Clouds 
1  broken clouds   04d   803  Clouds 
2  overcast clouds   04d   804  Clouds 
3  overcast clouds   04d   804  Clouds 
4  overcast clouds   04n   804  Clouds 

df = pd.concat([df.drop('weather', 1), df1], axis=1) 
print (df.head(10)) 
    city_id clouds.all   dt       dt_iso \ 
0 2193733   76 1447462800 2015-11-14 01:00:00 +0000 UTC 
1 2193733   76 1447470000 2015-11-14 03:00:00 +0000 UTC 
2 2193733   88 1447477200 2015-11-14 05:00:00 +0000 UTC 
3 2193733   88 1447480800 2015-11-14 06:00:00 +0000 UTC 
4 2193733   88 1447488000 2015-11-14 08:00:00 +0000 UTC 
5 2193733   88 1447491600 2015-11-14 09:00:00 +0000 UTC 
6 2193733   36 1447495200 2015-11-14 10:00:00 +0000 UTC 
7 2193733   36 1447498800 2015-11-14 11:00:00 +0000 UTC 
8 2193733   88 1447506000 2015-11-14 13:00:00 +0000 UTC 
9 2193733   88 1447513200 2015-11-14 15:00:00 +0000 UTC 

    main.humidity main.pressure main.temp main.temp_max main.temp_min \ 
0    52   1020  291.15   291.15   291.15 
1    45   1018  291.15   291.15   291.15 
2    48   1017  290.15   290.15   290.15 
3    55   1017  289.15   289.15   289.15 
4    58   1017  287.15   287.15   287.15 
5    62   1017  286.15   286.15   286.15 
6    71   1017  286.15   286.15   286.15 
7    71   1016  286.15   286.15   286.15 
8    76   1015  286.15   286.15   286.15 
9    87   1014  287.15   287.15   287.15 

    rain.3h wind.deg wind.speed weather.description weather.icon weather.id \ 
0  NaN  250   6  broken clouds   04d   803 
1  NaN  240   7  broken clouds   04d   803 
2  NaN  270   6  overcast clouds   04d   804 
3  NaN  250   4  overcast clouds   04d   804 
4  NaN  310   2  overcast clouds   04n   804 
5  NaN  310   2  overcast clouds   04n   804 
6  NaN  350   1 scattered clouds   03n   802 
7  NaN  10   2 scattered clouds   03n   802 
8  NaN  350   2  overcast clouds   04n   804 
9  NaN  340   3  overcast clouds   04n   804 

    weather.main 
0  Clouds 
1  Clouds 
2  Clouds 
3  Clouds 
4  Clouds 
5  Clouds 
6  Clouds 
7  Clouds 
8  Clouds 
9  Clouds 
+0

哇,这太酷了!双谢谢你回答了两个版本的Python – Axis

+1

很高兴能帮助你,祝你周末愉快! – jezrael

-1

如果我正确理解你的问题,我认为你几乎在那里。 :)

weatherArray = [ [{u'main': u'Clouds', u'id': 803, u'icon': u'04d', u'description': u'broken clouds'}], 
     [{u'main': u'Clouds', u'id': 803, u'icon': u'04d', u'description': u'broken clouds'}], 
     [{u'main': u'Clouds', u'id': 804, u'icon': u'04d', u'description': u'overcast clouds'}], 
     [{u'main': u'Clouds', u'id': 804, u'icon': u'04d', u'description': u'overcast clouds'}] ] 

for weather in weatherArray: 
    for i in weather: 
    print(i['main']) 
    print(i['id']) 
    print(i['icon']) 
    print(i['description']) 

    print('\n') 

通过weatherArray的内容使用上面的代码中循环,并在不同的列添加它们。