我有一些来自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,并在记事本++中进行比较)。如果我有数千行
,我无法确定这是什么影响答案 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
并将 传递给该函数。