Я хочу создать список из столбца 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()
, но я понятия не имею, как это сделать в этом случае. Заранее большое спасибо!
Хорошо, вот в чем проблема. Столбец отформатирован как строка вложенных списков, но без '
.
Но столбец по-прежнему является строкой? Если нет, то почему вы получаете к нему доступ с помощью df.str...
? Нам нужно, чтобы вы опубликовали реальный исполняемый код и данные (MCVE/минимальный воспроизводимый пример), как я и просил. Вот почему SO требует, чтобы вы опубликовали MCVE.
нет простого способа сделать это, кроме как просто запачкать руки и выполнить рекурсивный вызов в каждой ячейке.
Ваши входные данные не являются JSON, поскольку объекты a, b, c не являются строками «a», «b», «c». Кажется, вы хотите рекурсивно сгладить вложенные списки и цитировать каждый объект.
Вы можете попробовать применить пользовательскую функцию следующим образом:
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-символов.
Вы изобретаете велосипед; ввод представляет собой строку, похоже, это был JSON? Тогда просто используйте json.loads()
@smci '[a,b,c]'
НЕ является строкой JSON; '["a","b","c"]'
есть.
@QuangHoang: Моя ошибка. a,b,c не могут быть именами констант или переменных. Так что же хочет сделать ОП? Рекурсивно просматривать произвольно вложенный список, заключая все имена в кавычки в виде строки?
Если ваши строки простые (без экранированных кавычек/скобок), вы можете использовать простое регулярное выражение и 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']]]
Ваш столбец содержит строки (возможно, вложенные) списков, а не сами списки. Отправьте нам реальный исполняемый код и данные (MCVE).