背景
我正在使用模式导入一个JSON文件,如下所示:
{
"000001": {
"USA": {
"requests": 1234,
"RTT": 40
},
"Japan": {
"requests": 10,
"RTT": 200
}
},
"000002": {
"USA": {
"requests": 4321,
"RTT": 50
},
"Japan": {
"requests": 10,
"RTT": 150
}
}
}导入之后,我想对这些数据做两件事:
在将其转储到数据库时,我希望得到一个模式,如下所示:
+--------+---------+----------+-------+
| time* | country*| requests | RTT |
+--------+---------+----------+-------+
| 000001 | USA | 1234 | 40ms |
| 000001 | Japan | 10 | 200ms |
| 000002 | USA | 4321 | 50ms |
| 000002 | Japan | 20 | 150ms |
| ... | ... | ... | ... |问题
当前,要导入数据,我将执行以下操作:
>>>import numpy as np
>>>import flatdict as fd
>>>np.array(fd.FlatDict(json_string))
array([[000001, u'USA', u'requests', 1234],
[000001, u'USA', u'RTT', 40],
[000001, u'Japan', u'requests', 10],
...,
[000002, u'USA', u'RTT', 50],
[000002, u'Japan', u'requests', 20],
[000002, u'Japan', u'RTT', 150]],
dtype='<U31')这里的问题是,这会为每个值创建一个唯一的行,而不是为每个键创建一个唯一的行。如果有必要,我愿意编写自己的函数来替换flatdict,但问题是: NumPy可以为值提供元组/ ararys /对象吗?理想情况下,我希望输出如下所示:
>>>np.array(data)
array([[000001, u'USA', (1234, 40)],
[000001, u'Japan', (10, 200)],
[000002, u'USA', (4321, 50)],
[000002, u'Japan', (20, 150)]],
dtype='...')不过,我愿意接受:
>>>np.array(data)
array([[000001, u'USA', 1234, 40],
[000001, u'Japan', 10, 200],
[000002, u'USA', 4321, 50],
[000002, u'Japan', 20, 150]],
dtype='...')可替代可接受溶液
对于第一步(执行所有分析),我可以使用我现在拥有的NumPy数组。类似于array[:,"USA","requests"],它将始终返回在美国的请求数量。
这是第二步,我需要把它变成一种不同的格式。如果有办法的话
array([[000001, u'USA', u'requests', 1234],
[000001, u'USA', u'RTT', 40],
[000001, u'Japan', u'requests', 10],
...,
[000002, u'USA', u'RTT', 50],
[000002, u'Japan', u'requests', 20],
[000002, u'Japan', u'RTT', 150]],
dtype='<U31')把它写进表格:
[[000001, u'USA', 1234, 40],
[000001, u'Japan', 10, 200],
[000002, u'USA', 4321, 50],
[000002, u'Japan', 20, 150]]为了将其转储到数据库中,这也是可以的。
发布于 2017-08-29 17:29:07
整理字典有问题;对flatdict不太了解,但如果您有一个三级字典,您只需使用列表理解来将其压平:
[[k, kk, d[k][kk].get('requests'), d[k][kk].get('RTT')] for k in d for kk in d[k]]
#[['000002', 'USA', 4321, 50],
# ['000002', 'Japan', 10, 150],
# ['000001', 'USA', 1234, 40],
# ['000001', 'Japan', 10, 200]]对于非同构数据,如果需要在内存中进行分析,pandas通常更容易使用,然后使用numpy,则可以将其转换为如下所示的数据框架:
lst = [[k, kk, d[k][kk].get('requests'), d[k][kk].get('RTT')] for k in d for kk in d[k]]
import pandas as pd
pd.DataFrame(lst, columns=['time', 'country', 'requests', 'RTT'])

https://stackoverflow.com/questions/45944827
复制相似问题