Список столбцов списка Pandas в список Python

Я хочу создать список из столбца Pandas, отформатированный следующим образом:

data = {
    'col': [
        '[[a, b, c], [a,b]]',
        '[[a, b], [c]]',
        '[[x]]'
    ]
}

df = pd.DataFrame(data)

Результат должен быть примерно таким:

python_list = [[['a', 'b', 'c'], ['a', 'b'],
 [['a', 'b'], ['c']],
 [['x']]]

По сути, это List[List[List[Str]]]. Сделать это с невложенным списком было бы просто, например df.str.split().tolist(), но я понятия не имею, как это сделать в этом случае. Заранее большое спасибо!

Ваш столбец содержит строки (возможно, вложенные) списков, а не сами списки. Отправьте нам реальный исполняемый код и данные (MCVE).

smci 12.06.2024 04:44

Хорошо, вот в чем проблема. Столбец отформатирован как строка вложенных списков, но без '.

bachts 12.06.2024 04:47

Но столбец по-прежнему является строкой? Если нет, то почему вы получаете к нему доступ с помощью df.str...? Нам нужно, чтобы вы опубликовали реальный исполняемый код и данные (MCVE/минимальный воспроизводимый пример), как я и просил. Вот почему SO требует, чтобы вы опубликовали MCVE.

smci 12.06.2024 04:49

нет простого способа сделать это, кроме как просто запачкать руки и выполнить рекурсивный вызов в каждой ячейке.

Quang Hoang 12.06.2024 05:37

Ваши входные данные не являются JSON, поскольку объекты a, b, c не являются строками «a», «b», «c». Кажется, вы хотите рекурсивно сгладить вложенные списки и цитировать каждый объект.

smci 15.06.2024 04:11
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете попробовать применить пользовательскую функцию следующим образом:

def parse_list(s: str):
    q = []
    for c in s:
        if c == '[':    # indicate beginning of a list
            q.append(c)
        elif c == ']':  # indicate end of a list
            e = []      # create that list
            while True:    
                b = q.pop()  # pop the queue until we see the beginning  
                if b == '[':
                    break
                e.append(b)  # append the element to the list
            q.append(e[::-1]) # reverse the list and add back to queue
        elif c == ',' or c == ' ': # these does nothing
            # do nothing
            continue
        else:
            q.append(c)            # element, may need to modify this a bit
                
    return q[0]

out = df['col'].apply(parse_list).to_list()

Выход:

[[['a', 'b', 'c'], ['a', 'b']], [['a', 'b'], ['c']], [['x']]]

Примечание: это работает только для одноэлементных строк (a,b,c,...). Нужно модифицировать его для работы с общими строками, где нужно определить роль ,

Приятно;) При необходимости его также можно обновить для обработки escape-символов.

mozway 12.06.2024 07:00

Вы изобретаете велосипед; ввод представляет собой строку, похоже, это был JSON? Тогда просто используйте json.loads()

smci 14.06.2024 08:15

@smci '[a,b,c]' НЕ является строкой JSON; '["a","b","c"]' есть.

Quang Hoang 14.06.2024 15:43

@QuangHoang: Моя ошибка. a,b,c не могут быть именами констант или переменных. Так что же хочет сделать ОП? Рекурсивно просматривать произвольно вложенный список, заключая все имена в кавычки в виде строки?

smci 15.06.2024 01:53

Если ваши строки простые (без экранированных кавычек/скобок), вы можете использовать простое регулярное выражение и ast.literal_eval:

from ast import literal_eval
import re

out = [literal_eval(re.sub(r' *([^][ ,]+) *', r'"\1"', s))
       for s in df['col']]

Выход:

[[['a', 'b', 'c'], ['a', 'b']],
 [['a', 'b'], ['c']],
 [['x']]]

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