Как Вы читаете в фрейме данных со списками, используя pd.читать буфер обмена?
Вот некоторые данные из другого вопроса:
positive negative neutral
1 [marvel, moral, bold, destiny] [] [view, should]
2 [beautiful] [complicated, need] []
3 [celebrate] [crippling, addiction] [big]
Что бы я сделал сначала, это добавил кавычки через все слова, а затем:
import ast
df = pd.read_clipboard(sep='s{2,}')
df = df.applymap(ast.literal_eval)
Есть ли более разумный способ сделать это?
5 ответов:
Для базовых структур можно использовать yaml без добавления кавычек:
import yaml df = pd.read_clipboard(sep='\s{2,}').applymap(yaml.load) type(df.iloc[0, 0]) Out: list
Я сделал это так:
df = pd.read_clipboard(sep='\s{2,}', engine='python') df = df.apply(lambda x: x.str.replace(r'[\[\]]*', '').str.split(',\s*', expand=False))P. S. Я уверен, что там должен быть лучший способ, чтобы сделать это...
Другой альтернативой является
Обратите внимание, что это предполагает, что первый и последний символ в каждой ячейке -In [43]: df.applymap(lambda x: x[1:-1].split(', ')) Out[43]: positive negative neutral 1 [marvel, moral, bold, destiny] [] [view, should] 2 [beautiful] [complicated, need] [] 3 [celebrate] [crippling, addiction] [big][и]. Он также предполагает, что после запятой есть ровно один пробел.
Другая версия:
df.applymap(lambda x: ast.literal_eval("[" + re.sub(r"[[\]]", "'", re.sub("[,\s]+", "','", x)) + "]"))
За справку от @MaxU
df = pd.read_clipboard(sep='\s{2,}', engine='python')Затем:
>>> df.apply(lambda col: col.str[1:-1].str.split(', ')) positive negative neutral 1 [marvel, moral, bold, destiny] [] [view, should] 2 [beautiful] [complicated, need] [] 3 [celebrate] [crippling, addiction] [big] >>> df.apply(lambda col: col.str[1:-1].str.split()).loc[3, 'negative'] ['crippling', 'addiction']И в примечаниях от @unutbu, который пришел с аналогичным решением:
Предполагает, что первый и последний символ в каждой ячейке - это [ и]. Он также предполагает, что после запятой есть ровно один пробел.
Comments