我正在努力分析大量数据。它太大了,无法手动处理,因此我需要自动抓取并解析它,问题是我根本不是程序员,这是我有史以来的第一篇代码,所以我可能会错过一些显而易见的东西。
该集合是2700个项目中每个项目的123个字段,并非所有项目都具有所有字段的数据,并且某些字段具有多个值。可通过API响应访问数据,该API响应的JSON文件每次调用最多限制50个项目,我为每次调用付费。好,自己去解决问题:
我设法通过flatten模块获得了嵌套的JSON flat。 JSON中的键和生成的字典的项目名称不具有唯一性,因此生成的文件看起来像{‘item_1_param_1’ : ‘X’, ‘item_1_param_2’ : ‘Y’, … , ‘item_2700_param_123’ : ‘Z’}
。
我坚持这一点-我需要将此数据集作为表进行分析(在Excel或SPSS中),但我只能生成其中有1列和2700行的表。
我绝对很高兴拥有一张这样的桌子
item_1 item_2 … item_2700
param_1 X Y … K
param_2 L [M, N, O] … P
… … … … …
param_123 N/A Q … Z
下一步是做什么的想法(伪代码只是为了说明逻辑):
response = requests.get(url)
output = json.loads(response.text)
flat_json = flatten(output)
(完整的代码更大,因为此脚本供那些比我更了解编程的人稍后再使用,因此充满了检查和警告,并包含一些纠正方法来纠正API端生成的JSON中的错误)
因此,有一种方法可以提取dict键的一部分(例如从'item_1'
中提取'item_1_param_1'
,然后使用该部分作为列名将1-column表转换为多列并分配正确值吗?提前感谢帮助新手!
答案 0 :(得分:0)
这是可能的。您可以使用key_list = list(some_dictionary.keys())
获取密钥,然后可以说
for key in key_list:
separated_key_names = key.split('_') #separate key name at "_"
variable1 = " ".join(separated_key_names[0], separated_key_names[1])
variable2 = " ".join(separated_key_names[2], separated_key_names[3])
这将拆分键,并为每个名称(如(项目1,参数1))创建一个变量
您可能还对some_dictionary.items()
方法感兴趣。您可以这样使用
for key, value in some_dictionary:
separated_key_names = key.split('_') #separate key name at "_"
variable1 = " ".join(separated_key_names[0], separated_key_names[1])
variable2 = " ".join(separated_key_names[2], separated_key_names[3])
# Now you have separated the variable names, and the key. You can process how you want
my_info = {(variable1, variable2): value} # for example
我不确定您想如何重组数据,但是您应该能够从这里进行操作。如果您的帖子中有您不清楚的地方,请发表评论!
答案 1 :(得分:0)
如何?
import re
from itertools import groupby
def identify_item(pair):
return re.search('item_\d+', pair[0]).group()
gb = groupby(flat_json.items(), key=identify_item)
result = {item_id: {param.replace(item_id, '')[1:]: value
for param, value in param_pair}
for item_id, param_pair in gb}
这假设您的数据将采用问题中指定的格式;否则,可能需要进行一些调整。
示例:
>>> flat_json = {'item_{}_param_{}'.format(i, j): np.random.randint(0, 10) for i in range(1, 11) for j in range(1, 5)}
>>> # apply transformation
>>> result
{'item_1': {'param_1': 2, 'param_2': 2, 'param_3': 8, 'param_4': 9},
'item_2': {'param_1': 0, 'param_2': 2, 'param_3': 8, 'param_4': 7},
'item_3': {'param_1': 3, 'param_2': 7, 'param_3': 6, 'param_4': 7},
'item_4': {'param_1': 0, 'param_2': 9, 'param_3': 0, 'param_4': 4},
'item_5': {'param_1': 5, 'param_2': 1, 'param_3': 2, 'param_4': 9},
'item_6': {'param_1': 9, 'param_2': 5, 'param_3': 0, 'param_4': 0},
'item_7': {'param_1': 4, 'param_2': 7, 'param_3': 4, 'param_4': 2},
'item_8': {'param_1': 2, 'param_2': 8, 'param_3': 5, 'param_4': 7},
'item_9': {'param_1': 5, 'param_2': 4, 'param_3': 1, 'param_4': 8},
'item_10': {'param_1': 4, 'param_2': 0, 'param_3': 3, 'param_4': 0}}