我创建了一个数据集,如下所示。
train = pd.DataFrame({'id':[1,2,4],'features':[["A","B","C"],["A","D","E"],["C","D","F"]]})
当我执行以下行时:
train['features_t'] = train["features"].apply(lambda x: " ".join(["_".join(i.split(" ")) for i in x]))
它产生了一个很好的结果。
0 A B C
1 A D E
2 C D F
但是,我对申请中的功能很好奇。它基本上迭代列车数据帧的特征列中的值。之后,它会拆分A,B,C并连接回来,没有任何分隔符。但是当我尝试逐步执行时,它给出了一个关于split功能的错误。
我尝试创建一个for循环,然后分割函数和连接函数,但失败了。
for x in train['feature']:
a = x.split(" ")
............................
它给了我这个
'list' object has no attribute 'split'
我对此的理解可能有什么问题?
x是每行的列表
如果你打印它:
for x in train['features']:
print(x)
结果将是:
['A', 'B', 'C']
['A', 'D', 'E']
['C', 'D', 'F']
您可以使用以下命令完成连接:
for x in train['features']:
a = ''.join(x)
将打印:ABC ADE CDF
你忽略了一个额外级别的循环,因为它不是由DataFrame上的apply
调用自动完成的。 lambda
函数在作为字符串列表的值上调用。所以列表理解是迭代那些字符串(例如'A'
,然后是'B'
,然后是'C'
)。在字符串上调用split
方法。
在您的显式循环版本中,您尝试在列表中调用split
。尝试在循环中添加额外的级别,它应该工作:
for x in train['feature']:
for i in x:
a = i.split(' ') # this works
我注意到split
后面跟join
的调用是一种用每个字符串中的下划线替换空格的间接方式(在你的例子中没有,但也许你的实际数据中可能存在)。您可以使用str.replace
直接到达那里:
lambda x: " ".join([i.replace(" ", "_") for i in x])