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

Предполагается, что первый и последний символ в каждой ячейке - это [и]. Также предполагается, что после запятых есть ровно один пробел.

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