Как преобразовать нерегулярный список списка в фрейм данных

У меня есть этот нерегулярный список:

['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

Извините за неполный вопрос минуту назад, видимо, мой список списков более сложный.

Как это обобщается? Всегда ли есть только 1 список с большим количеством значений? Если нет, можете привести пример?

mozway 16.02.2023 23:27

вы полностью изменили свой ввод. Почему все отвечающие должны переписывать свою работу?

RomanPerekhrest 17.02.2023 00:21

@RomanPerekhrest Это была моя ошибка неправильно привести список в качестве примера, я все равно многому научился, спасибо

Raknaros 17.02.2023 00:24

@Raknaros Я вижу, вы пытаетесь принять несколько ответов, обратите внимание, что вы можете выбрать только один;)

mozway 17.02.2023 19:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете разделить список ввода на 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 16.02.2023 23:37

@SomeDude sorted - хорошее дополнение, я хотел программное решение, не загромождающее код, это должно сработать!

mozway 16.02.2023 23:40

Я пробовал решения, которые они мне дали, шаг за шагом, и вот как я нашел это решение:

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, так как вы получили помощь от этого ответа, а также это поможет другим, которые ищут похожие вопросы.

SomeDude 17.02.2023 03:46

Другие вопросы по теме