是否可以将dict键的一部分用作表的列名?

时间:2019-03-07 23:03:14

标签: python

我正在努力分析大量数据。它太大了,无法手动处理,因此我需要自动抓取并解析它,问题是我根本不是程序员,这是我有史以来的第一篇代码,所以我可能会错过一些显而易见的东西。

该集合是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表转换为多列并分配正确值吗?提前感谢帮助新手!

2 个答案:

答案 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}}