Как Вы читаете в фрейме данных со списками, используя 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)


Есть ли более разумный способ сделать это?
520   5  

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

    Ничего не найдено.