python3:json数据在读取后略有变化

时间:2017-10-21 15:47:48

标签: python json pandas

我有一些来自webscraping twitter的json数据,在notepad ++中打开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)

运行print(data.dtypes)后,我看到id_str是int64

我不太明白发生了什么,如果id不再匹配似乎是一个很大的问题(我继续将数据保存回新的json,并在记事本++中进行比较)。如果我有数千行

,我无法确定这是什么影响

1 个答案:

答案 0 :(得分: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并将 传递给该函数。