如何使用pd.read_clipboard读取带有列表的数据框?

cs9*_*s95 9 python clipboard dataframe pandas

以下是另一个问题的一些数据:

                          positive                 negative          neutral
1   [marvel, moral, bold, destiny]                       []   [view, should]
2                      [beautiful]      [complicated, need]               []
3                      [celebrate]   [crippling, addiction]            [big]
Run Code Online (Sandbox Code Playgroud)

我首先要做的是在所有单词中添加引号,然后:

import ast

df = pd.read_clipboard(sep='\s{2,}')
df = df.applymap(ast.literal_eval)
Run Code Online (Sandbox Code Playgroud)

有更聪明的方法吗?

ayh*_*han 11

对于基本结构,您可以使用yaml而无需添加引号:

import yaml
df = pd.read_clipboard(sep='\s{2,}').applymap(yaml.load)

type(df.iloc[0, 0])
Out: list
Run Code Online (Sandbox Code Playgroud)

  • 精彩!简短又甜蜜. (2认同)
  • 我认为进口这个防弹解决方案需要付出很小的代价.只要它内置,它就没问题了.所有其他答案都很精彩,但我特别接受这一点,因为它简单. (2认同)

Max*_*axU 8

我是这样做的:

df = pd.read_clipboard(sep='\s{2,}', engine='python')
df = df.apply(lambda x: x.str.replace(r'[\[\]]*', '').str.split(',\s*', expand=False))
Run Code Online (Sandbox Code Playgroud)

PS我敢肯定 - 必须有更好的方法来做到这一点......

  • 比这更好:`df = pd.DataFrame({'positive':[['marvel','moral','bold','destiny'],['beutiful'],['celeb']],'否定':[[],['复杂','需要'],['残废','成瘾'],'中立':[['view','should'],[],['big' ]]})`... (4认同)
  • 对于小片段,`df.applymap(lambda x:x [1:-1] .split(','))`也可能有效(但不像MaxU的答案那样处理空格.) (3认同)

unu*_*tbu 6

另一种选择是

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]
Run Code Online (Sandbox Code Playgroud)

请注意,这假定每个单元格中的第一个和最后一个字符是[].它还假设逗号后面只有一个空格.


DYZ*_*DYZ 5

另一个版本:

df.applymap(lambda x:
            ast.literal_eval("[" + re.sub(r"[[\]]", "'", 
                                          re.sub("[,\s]+", "','", x)) + "]"))
Run Code Online (Sandbox Code Playgroud)


Ale*_*der 5

来自@MaxU的帮助

df = pd.read_clipboard(sep='\s{2,}', engine='python')
Run Code Online (Sandbox Code Playgroud)

然后:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

根据来自@unutbu的笔记,他们提出了类似的解决方案:

假设每个单元格中的第一个和最后一个字符是[和].它还假设逗号后面只有一个空格.