У меня есть этот нерегулярный список:
['6', '20553737100', '6', '20431084172', '25200.00', '4536.00', 'PEN', '09', 'EG01', '124', '2022-06-20', '29735.43', ['POLO MANGA LARGA T L', '600.00', '16.90', '19.942', '1825.20', '10140.00', '18.00'], ['POLO MANGA LARGA T M', '600.00', '16.90', '19.942', '1825.20', '10140.00', '18.00'], ['LENTE LUNA CLARA TSG-100 ANTIEMPAÑO SIMPLE', '800.00', '2.65', '3.127', '381.60', '2120.00', '18.00'], ['LENTE LUNA OSCURA TSG-100 ANTIEMPAÑO C/CORDON', '800.00', '3.50', '4.13', '504.00', '2800.00', '18.00']
Я хотел бы, чтобы это выглядело так в фрейме данных:
0 6 20553737100 6 20431284172 25200 4536 PEN 09 EG01 124 2022-06-02 29735.43 POLO MANGA LARGA T L 600 16.9 19.942 10140 1825.2 18
1 6 20553737100 6 20431284172 25200 4536 PEN 09 EG01 124 2022-06-02 29735.43 POLO MANGA LARGA T M 600 16.9 19.942 10140 1825.2 18
2 6 20553737100 6 20431284172 25200 4536 PEN 09 EG01 124 2022-06-02 29735.43 LENTE LUNA OSCURA TSG 800 2.65 3.127 2120 381.6 18
3 6 20553737100 6 20431284172 25200 4536 PEN 09 EG01 124 2022-06-02 29735.43 LENTE LUNA OSCURA JAE 800 3.5 4.13 2800 504 18
Извините за неполный вопрос минуту назад, видимо, мой список списков более сложный.
Вы полностью изменили свой ввод. Почему все отвечающие должны переписывать свою работу?
@RomanPerekhrest Это была моя ошибка неправильно привести список в качестве примера, я все равно многому научился, спасибо
@Raknaros Я вижу, вы пытаетесь принять несколько ответов, обратите внимание, что вы можете выбрать только один;)
Вы можете разделить список ввода на 2 части, чтобы построить 2 фрейма данных, которые затем объединяются:
lst = ['6', '20553737100', '6', '20431084172', '25200.00', '4536.00', 'PEN', '09', 'EG01', '124', '2022-06-20', '29735.43', ['POLO MANGA LARGA T L', '600.00', '16.90', '19.942', '1825.20', '10140.00', '18.00'], ['POLO MANGA LARGA T M', '600.00', '16.90', '19.942', '1825.20', '10140.00', '18.00'], ['LENTE LUNA CLARA TSG-100 ANTIEMPAÑO SIMPLE', '800.00', '2.65', '3.127', '381.60', '2120.00', '18.00'], ['LENTE LUNA OSCURA TSG-100 ANTIEMPAÑO C/CORDON', '800.00', '3.50', '4.13', '504.00', '2800.00', '18.00']]
df = pd.concat([pd.DataFrame({f'column_{i}': v for i, v in enumerate(lst[:12], 1)}, index=[0]),
pd.DataFrame(columns=[f'column_{i}' for i in range(13, 13 + len(lst[12]))],
data=lst[12:])], axis=1).ffill()
print(df)
column_1 column_2 column_3 column_4 column_5 column_6 column_7 \
0 6 20553737100 6 20431084172 25200.00 4536.00 PEN
1 6 20553737100 6 20431084172 25200.00 4536.00 PEN
2 6 20553737100 6 20431084172 25200.00 4536.00 PEN
3 6 20553737100 6 20431084172 25200.00 4536.00 PEN
column_8 column_9 column_10 column_11 column_12 \
0 09 EG01 124 2022-06-20 29735.43
1 09 EG01 124 2022-06-20 29735.43
2 09 EG01 124 2022-06-20 29735.43
3 09 EG01 124 2022-06-20 29735.43
column_13 column_14 column_15 \
0 POLO MANGA LARGA T L 600.00 16.90
1 POLO MANGA LARGA T M 600.00 16.90
2 LENTE LUNA CLARA TSG-100 ANTIEMPAÑO SIMPLE 800.00 2.65
3 LENTE LUNA OSCURA TSG-100 ANTIEMPAÑO C/CORDON 800.00 3.50
column_16 column_17 column_18 column_19
0 19.942 1825.20 10140.00 18.00
1 19.942 1825.20 10140.00 18.00
2 3.127 381.60 2120.00 18.00
3 4.13 504.00 2800.00 18.00
Использование перекрестного слияния:
l = [['a'],['b'],['c'],['d'],[[5],[9],[7],[4]]]
(pd.DataFrame(l[:4]).T.merge(pd.DataFrame(l[4]), how='cross')
.set_axis([f'column_{i+1}' for i in range(5)], axis=1)
)
Выход:
column_1 column_2 column_3 column_4 column_5
0 a b c d 5
1 a b c d 9
2 a b c d 7
3 a b c d 4
Еще одна идея с использованием пользовательской функции для удаления исходного списка:
def unnest(l):
if len(l) == 1:
return l[0]
return [unnest(x) for x in l]
pd.DataFrame([unnest(l)]).explode(4, ignore_index=True))
Или программный вариант, чтобы не указывать столбцы в explode:
(pd.DataFrame([unnest(l)])
.pipe(lambda d: d.explode(list (d.columns[d.iloc[0].str.len().gt(1)]), ignore_index=True))
)
Выход:
0 1 2 3 4
0 a b c d 5
1 a b c d 9
2 a b c d 7
3 a b c d 4
Та же идея. l = sorted(l, key=len) pd.DataFrame(l[:-1]).T.merge(pd.DataFrame(l[-1]), how='cross')
@SomeDude sorted - хорошее дополнение, я хотел программное решение, не загромождающее код, это должно сработать!
Я пробовал решения, которые они мне дали, шаг за шагом, и вот как я нашел это решение:
df = (pd.DataFrame(filas[:12])
.T
.merge(pd.DataFrame(filas[13:17]), how='cross')
.set_axis([f'column_{i+1}' for i in range(19)], axis=1))
Итак, это следующее
column_1 column_2 column_3 column_4 column_5 column_6 column_7 column_8 ... column_12 column_13 column_14 column_15 column_16 column_17 column_18 column_19
0 6 20553737100 6 20431084172 25200.00 4536.00 PEN 09 ... 2022-06-20 POLO MANGA LARGA T L 600.00 16.90 19.942 10140.00 1825.20 18.00
1 6 20553737100 6 20431084172 25200.00 4536.00 PEN 09 ... 2022-06-20 POLO MANGA LARGA T M 600.00 16.90 19.942 10140.00 1825.20 18.00
2 6 20553737100 6 20431084172 25200.00 4536.00 PEN 09 ... 2022-06-20 LENTE LUNA CLARA TSG-100 ANTIEMPAÑO SIMPLE 800.00 2.65 3.127 2120.00 381.60 18.00
3 6 20553737100 6 20431084172 25200.00 4536.00 PEN 09 ... 2022-06-20 LENTE LUNA OSCURA TSG-100 ANTIEMPAÑO C/CORDON 800.00 3.50 4.13 2800.00 504.00 18.00
Спасибо за все
Пожалуйста, найдите время, чтобы проголосовать/принять ответ @mozway, так как вы получили помощь от этого ответа, а также это поможет другим, которые ищут похожие вопросы.
Как это обобщается? Всегда ли есть только 1 список с большим количеством значений? Если нет, можете привести пример?