将两个列表组合成具有键和值的字典,然后转换为数据框

时间:2019-09-05 12:18:10

标签: python pandas list dictionary

我有两个列表

keys = ['a', 'b', 'c', 'd']
values = ["1", "2", "3", "4", "5", "6", "7", "8"]

我的键列表中的值应该是最终字典中稍后的键,而我的值列表中的值应该是它们的值。

输出应如下所示:

result : [{
    "a": "1",
    "b": "2",
    "c": "3",
    "d": "4"
    },
    {
    "a": "5",
    "b": "6",
    "c": "7",
    "d": "8"
    }]

后来我想做一个json_normalize有一张桌子。

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
| 5 | 5 | 7 | 8 |
+---+---+---+---+

我需要一个解决方案,其中values-list的长度是动态的。因此,它应该使用8个值,例如使用64个值。

我尝试将zip()intertools.cycle结合使用

values = ["1","2","3","4","5","6","7","8"]
keys = ["A","B","C"]

from itertools import cycle
zip_list = zip(cycle(keys), values)

result = set(zip_list)
result

这里是结果

{('A', '1'),
 ('A', '4'),
 ('A', '7'),
 ('B', '2'),
 ('B', '5'),
 ('B', '8'),
 ('C', '3'),
 ('C', '6')}

我无法使用此解决方案,因为首先我无法执行json_normalize()来将其快速而轻松地转换为数据帧,其次是对集合进行排序,而我不想对其进行排序。 如何以另一种方式实现我的目标?

2 个答案:

答案 0 :(得分:2)

我建议您通过一种简单的方法来实现此目的,方法是根据values的长度将列表keys分成多个块,然后使用结果构建数据框:

n = len(keys)
l = [values[i:i + n] for i in range(0, len(values), n)]
# [['1', '2', '3', '4'], ['5', '6', '7', '8']]
pd.DataFrame(l, columns=keys)

   a  b  c  d
0  1  2  3  4
1  5  6  7  8

只是为了好玩,这是一个基于itertools的方法,遵循您的方法中的想法(尽管出于明显的原因,我强烈建议使用第一种方法):

from itertools import repeat, islice
keys = ['a', 'b', 'c', 'd']
values = ["1", "2", "3", "4", "5", "6", "7", "8"]
i_values = iter(values)
r = len(values)//len(keys)

d = [dict(zip(k, islice(i_values, len(k)))) for k in repeat(keys, r)]
# [{'a': '1', 'b': '2', 'c': '3', 'd': '4'}, {'a': '5',...

print(pd.DataFrame(d))
   a  b  c  d
0  1  2  3  4
1  5  6  7  8

答案 1 :(得分:1)

使用pandas.DataFrame构造函数非常简单:

import pandas as pd

keys = ['a', 'b', 'c', 'd']
values = ["1", "2", "3", "4", "5", "6", "7", "8"]

step = len(keys)
df = pd.DataFrame([dict(zip(keys, values[i:i+step])) for i in range(0, len(values), step)])
print(df)

输出:

   a  b  c  d
0  1  2  3  4
1  5  6  7  8