2017-04-27 70 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的內容使用上面的代碼中循環,並在不同的列添加它們。