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

时间:2017-08-18 14:05:56

标签: python string pandas csv

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

Title|Tags
T1|"[Tag1,Tag2]"
T1|"[Tag1,Tag2,Tag3]"
T2|"[Tag3,Tag1]"
使用

df = pd.read_csv('file.csv', sep='|')

输出是:

  Title              Tags
0    T1       [Tag1,Tag2]
1    T1  [Tag1,Tag2,Tag3]
2    T2       [Tag3,Tag1]

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

In [64]: df['Tags'][0][0]
Out[64]: '['

我需要将其作为["Tag1","Tag2"]之类的字符串列表来阅读。我尝试了this问题中提供的解决方案,但没有运气,因为我有[]字符实际上搞乱了事情。

期望的输出应该是:

In [64]: df['Tags'][0][0]
Out[64]: 'Tag1'

6 个答案:

答案 0 :(得分:7)

您可以手动拆分字符串:

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

答案 1 :(得分:3)

您可以使用stripsplit将字符串转换为列表。

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

df_out.Tags[0][0]

输出:

'Tag1'

答案 2 :(得分:3)

df.Tags=df.Tags.str[1:-1].str.split(',').tolist()

答案 3 :(得分:1)

您的$(".expanding-subhead-active").on('click', function(e){ e.preventDefault(); //$(".toggle-container").not($(this).next()).hide(300); $('#right .toggle-container').hide(); $("div[rel='profile_" + $(this).attr("profile") + "']").show(300,"linear"); 似乎是一个字符串列表。如果你打印那个列表,你应该得到df['Tags']这就是为什么当你调用第一个元素的第一个元素时,你实际上得到了字符串的第一个单个字符,而不是你想要的。

您需要在之后解析该字符串。执行类似

的操作
["[tag1,tag2]","[Tag1,Tag2,Tag3]","[Tag3,Tag1]"]

但正如您在引用的示例中所看到的,这将为您提供一个类似于

的列表
df['Tags'][0] = df['Tags'][0].split(',')

您需要的是一种解析字符串编辑多个字符的方法。您可以使用简单的正则表达式来执行此操作。类似的东西:

in: df['Tags'][0][0] 
out: '[tag1'`

将打印:

 import re
 df['Tags'][0] = re.findall(r"[\w']+", df['Tags'][0])
 print(df['Tags'][0][0])

使用涉及Pandas转换器的其他答案,您可以编写如下转换器:

 'tag1'

如果您不知道正则表达式,它们可能非常强大,但如果您不确定输入字符串的内容,也会无法预测。此处使用的表达式 def clean(seq_string): return re.findall(r"[\w']+", seq_string) 将匹配任何常用单词字符字母数字和下划线,并将其他所有内容视为r"[\w']+"的一个点,以便将列表拆分为。

答案 4 :(得分:0)

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

import json
import pandas

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

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

答案 5 :(得分:0)

这是一个简单而高效的操作:

df['Tags'].str.split(',')