我有这个'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'
答案 0 :(得分:7)
您可以手动拆分字符串:
>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(','))
>>> df.Tags[0]
['Tag1', 'Tag2']
答案 1 :(得分:3)
您可以使用strip
和split
将字符串转换为列表。
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(',')