pandas - 将字符串转换为字符串列表

Fab*_*nna 8 python csv string pandas

我有这个'file.csv'文件用pandas读取:

Title|Tags
T1|"[Tag1,Tag2]"
T1|"[Tag1,Tag2,Tag3]"
T2|"[Tag3,Tag1]"
Run Code Online (Sandbox Code Playgroud)

运用

df = pd.read_csv('file.csv', sep='|')
Run Code Online (Sandbox Code Playgroud)

输出是:

  Title              Tags
0    T1       [Tag1,Tag2]
1    T1  [Tag1,Tag2,Tag3]
2    T2       [Tag3,Tag1]
Run Code Online (Sandbox Code Playgroud)

我知道该列Tags是一个完整的字符串,因为:

In [64]: df['Tags'][0][0]
Out[64]: '['
Run Code Online (Sandbox Code Playgroud)

我需要把它读作一个字符串列表["Tag1","Tag2"].我尝试了这个问题中提供的解决方案,但没有运气,因为我有[]字符实际搞乱事情.

期望的输出应该是:

In [64]: df['Tags'][0][0]
Out[64]: 'Tag1'
Run Code Online (Sandbox Code Playgroud)

rdm*_*ony 17

您可以使用内置的ast.literal_eval,它适用于元组和列表

\n
import ast\nimport pandas as pd\n\ndf = pd.DataFrame({"mytuples": ["(1,2,3)"]})\n\nprint(df.iloc[0,0])\n# >> \'(1,2,3)\'\n\ndf["mytuples"] = df["mytuples"].apply(ast.literal_eval)\n\nprint(df.iloc[0,0])\n# >> (1,2,3)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

编辑:eval应该避免!如果正在评估的字符串是,os.system(\xe2\x80\x98rm -rf /\xe2\x80\x99)它将开始删除计算机上的所有文件(此处)。提供的ast.literal_eval字符串或节点可能仅包含以下 Python 文字结构:字符串、字节、数字、元组、列表、字典、集合、布尔值和 None(此处)。谢谢@TrentonMcKinney :)

\n


Mik*_*ler 8

您可以手动拆分字符串:

>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(','))
>>> df.Tags[0]
['Tag1', 'Tag2']
Run Code Online (Sandbox Code Playgroud)

  • 或将其应用于负载...`df = pd.read_csv('file.csv',sep ='|',converters = {'Tags':lambda x:x [1:-1] .split(',' )})` (5认同)

RHS*_*159 6

我认为您可以使用 json 模块。

import json
import pandas

df = pd.read_csv('file.csv', sep='|')
df['Tags'] = df['Tags'].apply(lambda x: json.loads(x))
Run Code Online (Sandbox Code Playgroud)

因此,这将像以前一样加载您的数据框,然后将 lambda 函数应用于Tags列中的每个项目。lambda 函数调用json.loads()将列表的字符串表示形式转换为实际列表。

  • 我认为这是一个更好的解决方案,不太容易出错!另请注意,您可以直接将 `json.loads` 作为 `apply` 参数传递:`df['Tags'].apply(json.loads)` (3认同)

Sco*_*ton 5

strip您可以使用和将字符串转换为列表split

df_out = df.assign(Tags=df.Tags.str.strip('[]').str.split(','))

df_out.Tags[0][0]
Run Code Online (Sandbox Code Playgroud)

输出:

'Tag1'
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

要么

df.Tags=df.Tags.str[1:-1].str.split(',').tolist()
Run Code Online (Sandbox Code Playgroud)

  • @WeNToBen - 很好的解决方案。愿意扩展一下吗?为什么我们需要`str[1:-1]`,为什么不是`str[0:-1]`?(顺便说一句,对我来说两者都产生相同的结果)。另外,如果 split() 已经创建了一个列表,为什么我们要显式调用 tolist() 呢? (2认同)
  • @zerohedge导致您要删除开头的“ [”和结尾的“]” (2认同)
  • @zerohedge啊,我需要删除一个,你是对的 (2认同)