Python 如何使用pd.read\u剪贴板读取包含列表的数据帧?

Python 如何使用pd.read\u剪贴板读取包含列表的数据帧?,python,pandas,dataframe,clipboard,Python,Pandas,Dataframe,Clipboard,以下是来自另一方的一些数据: 我首先要做的是在所有单词中添加引号,然后: import ast df = pd.read_clipboard(sep='\s{2,}') df = df.applymap(ast.literal_eval) 有更聪明的方法吗?我是这样做的: df = pd.read_clipboard(sep='\s{2,}', engine='python') df = df.apply(lambda x: x.str.replace(r'[\[\]]*', '').str

以下是来自另一方的一些数据:

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

import ast

df = pd.read_clipboard(sep='\s{2,}')
df = df.applymap(ast.literal_eval)
有更聪明的方法吗?

我是这样做的:

df = pd.read_clipboard(sep='\s{2,}', engine='python')
df = df.apply(lambda x: x.str.replace(r'[\[\]]*', '').str.split(',\s*', expand=False))
PS我敢肯定-一定有更好的方法来做到这一点…

字符串列表 对于无需添加引号即可使用的基本结构:

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

type(df.iloc[0, 0])
Out: list

数字数据列表 在某些情况下,您可以将列表读取为字符串,然后使用
literal\u eval
(或者
pd.eval
,如果它们是简单列表,则转换它们)

比如说,

           A   B
0  [1, 2, 3]  11
1  [4, 5, 6]  12
首先,确保列之间至少有两个空格,然后复制数据并运行以下操作:

import ast 

df = pd.read_clipboard(sep=r'\s{2,}', engine='python')
df['A'] = df['A'].map(ast.literal_eval)    
df
    
           A   B
0  [1, 2, 3]  11
1  [4, 5, 6]  12

df.dtypes

A    object
B     int64
dtype: object
注释

  • 对于多列,在转换步骤中使用
    applymap

    df[['A', 'B', ...]] = df[['A', 'B', ...]].applymap(ast.literal_eval)
    
  • 如果列可以包含NAN,请定义一个可以适当处理它们的函数:

    parser = lambda x: x if pd.isna(x) else ast.literal_eval(x)
    df[['A', 'B', ...]] = df[['A', 'B', ...]].applymap(parser)
    
  • 如果列包含字符串列表,如果不想手动添加,则需要类似于
    yaml.load
    (需要安装)的内容来解析它们 引用数据。见上文

另一个版本:

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

另一种选择是

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]
注意,这假定每个单元格中的第一个和最后一个字符是
[
]
。 它还假设逗号后面正好有一个空格。

根据@MaxU的帮助

df = pd.read_clipboard(sep='\s{2,}', engine='python')
然后:

根据@unutbu的笔记,他提出了一个类似的解决方案:

假设每个单元格中的第一个和最后一个字符为[和]。它还假设逗号后正好有一个空格


比这种方式更好:
df=pd.DataFrame({'positive':[['marvel'、['moral'、['bold'、['destiny']、['beutiful']、['profected']、['defect']、['dependential']、['neutral':['view'、['should']、['big']]]]]})
对于小代码段,
df.applymap(lambda x:x[1]、[1]、[1]、[1],][/code>)
(但并不像MaxU的回答那样有力地处理空格。)@unutbu,它看起来不错-你能把你的评论变成一个答案吗?我认为进口是一个很小的价格为有一个解决方案这种防弹。只要它是内置的,它是好的。所有其他的答案都很好,但我接受这一个,特别是因为它的简单性。纠正我以前的评论:yaml不是内置的,它的库需要安装pip。为错误信息道歉!
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']