Смотря конвертировать:
nested_list =
[('R1',
{'a', 'b', 'c'},
{20.0, 40.0, 50.0, 60.0, 750.0}),
('R2',
{'x', 'y', 'z'},
{35.0, 37.5, 165.0}),
('R3',
{'x', 'a', 'm'},
{2.5, 5.0, 7.5, 10.0, 12.5, 45.0})]
... в dataframe следующим образом:
Cat Column Value
--- ------ -----
R1 a 20.0
R1 a 40.0
R1 a 50.0
R1 a 60.0
R1 b 20.0
R1 b 40.0
...
R3 m 12.5
R3 m 45.0
Каждая строка списка (например, R1) имеет набор показаний (например, {20.0, 40.0...}
) и набор элементов ({'a', 'b',...}
). Показания и элементы имеют неравный размер.
Сначала создайте список из первого элемента, а затем разверните его по product
, а также добавьте sorted
если необходимо:
from itertools import product
L = [[[x[0]], sorted(x[1]), sorted(x[2])] for x in nested_list]
df1 = pd.DataFrame([j for i in L for j in product(*i)], columns=['Cat','Column','Value'])
print (df1.head(20))
Cat Column Value
0 R1 a 20.0
1 R1 a 40.0
2 R1 a 50.0
3 R1 a 60.0
4 R1 a 750.0
5 R1 b 20.0
6 R1 b 40.0
7 R1 b 50.0
8 R1 b 60.0
9 R1 b 750.0
10 R1 c 20.0
11 R1 c 40.0
12 R1 c 50.0
13 R1 c 60.0
14 R1 c 750.0
15 R2 x 35.0
16 R2 x 37.5
17 R2 x 165.0
18 R2 y 35.0
19 R2 y 37.5
Здесь один из способов использования itertools
, заданный входной список L
:
from itertools import chain, product, repeat
col, value = zip(*(list(i) for item in L for i in product(item[1], item[2])))
cat = list(chain.from_iterable(repeat(i, len(j) * len(k)) for i, j, k in L))
df = pd.DataFrame({'Cat': cat, 'Column': col, 'Value': value})
df = df.sort_values(['Cat', 'Column', 'Value']).reset_index(drop=True)
print(df)
Cat Column Value
0 R1 a 20.0
1 R1 a 40.0
2 R1 a 50.0
3 R1 a 60.0
4 R1 a 750.0
5 R1 b 20.0
...
39 R3 x 10.0
40 R3 x 12.5
41 R3 x 45.0
flatten
, проверьте это также для упрощенной версии с версией цикла.