2017-10-21 96 views
0

我有從webscraping微博在記事本中打開JSON一些JSON數據之後稍微改變++示出此示例關鍵值對:python3:JSON數據被讀取

"id_str": "823962574509248514", 

但在JSON讀取後(我有兩種方式如下圖):

filename = "../TheTweets/data/short.json" 
columnName = ['id_str','created_at', 'full_text','in_reply_to_status_id'] 
data = pd.read_json(filename, orient=columnName) 
#data = pd.DataFrame(pd.read_json(filename, orient=columnName,encoding="utf-8"),columns=columnName) 

我注意到ID_STR數量變化:

"id_str":823962574509248512, (looks like the last number) 

運行後打印(data.dtypes),我看到id_str是int64

我不太明白髮生了什麼,它似乎是一個很大的問題,如果ids不匹配了(我繼續保存數據回到一個新的JSON中,並在記事本++中進行比較)。我不太清楚這是什麼影響,如果我有成千上萬的行

+0

奇怪的值改變,但特別是從字符串到數字的類型改變! – Indent

+0

@Indent我正在考慮如何在read_json過程中指定dtypes – user3120554

+0

您是否嘗試過'json_normalize'? –

回答

0

這似乎是一個錯誤(不要引用我),與pd.read_json隱式轉換字符串爲整數,不會發生。您可以嘗試強制dtype並防止轉換髮生。

這是目前正在發生的事情對你:

In [107]: j 
Out[107]: '{"id_str":{"0":"823962574509248514"}}' 

In [108]: pd.read_json(j) 
Out[108]: 
       id_str 
0 823962574509248512 

現在,通過在dtype參數read_json,看到了差距:

In [109]: pd.read_json(j, dtype={'id_str' : str}) 
Out[109]: 
       id_str 
0 823962574509248514 # note the difference in the last digit 

In [110]: _.dtypes 
Out[110]: 
id_str object 
dtype: object 

如果要強制多列,加dtype字典的更多關鍵值。如果你想把的一切作爲一個字符串,dtype=str就可以了。


那麼,這是有前途的。根據您的樣本數據,json_normalize似乎是要走到這裏的路。

In [132]: pd.io.json.json_normalize(json.loads(data)) 
Out[132]: 
         created_at \ 
0 Tue Jan 24 18:36:00 +0000 2017 

              full_text    id_str \ 
0 @ABC Can I send a DM, I've emailed twice and g... 823962574509248514 

    in_reply_to_status_id 
0     None 

注意id_str作品。在你的情況下,你需要在你的文件上調用json.load並將傳遞給函數。

+0

我增加了data = pd.read_json(文件名,orient = columnName,dtype = str), ,它似乎解決了這個問題,同時引入了另一個。作爲處理的一部分,我將數據保存到兩個不同的jsons中,兩個代碼相同(只是不同的文件名,在dtype更改之前它們都被填充,但之後只有一個)(一個靠近開始處填充,另一個處於末尾data.to_json('new_short.json',orient ='records',date_format ='iso') – user3120554

+0

@ user3120554很難說沒有數據,但我會推薦做' df = pd.io.json.json_normalize(open('new_short.json')。read())'看看是什麼。 –

+0

我得到錯誤AttributeError:'str'對象沒有屬性值' – user3120554