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)
我是这样做的:
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我敢肯定 - 必须有更好的方法来做到这一点......
另一种选择是
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)
请注意,这假定每个单元格中的第一个和最后一个字符是[和].它还假设逗号后面只有一个空格.
另一个版本:
df.applymap(lambda x:
ast.literal_eval("[" + re.sub(r"[[\]]", "'",
re.sub("[,\s]+", "','", x)) + "]"))
Run Code Online (Sandbox Code Playgroud)
来自@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的笔记,他们提出了类似的解决方案:
假设每个单元格中的第一个和最后一个字符是[和].它还假设逗号后面只有一个空格.