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']