我有两个列表
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()
来将其快速而轻松地转换为数据帧,其次是对集合进行排序,而我不想对其进行排序。
如何以另一种方式实现我的目标?
答案 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