Как вы читаете в кадре данных со списками, используя pd.read_clipboard?
Вот некоторые данные из другого вопроса:
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))
PS Я уверен - должен быть лучший способ сделать это...
Другая альтернатива
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, который придумал подобное решение:
Предполагается, что первый и последний символ в каждой ячейке - это [и]. Также предполагается, что после запятых есть ровно один пробел.