Lambda和列表理解在这个等式中

问题描述 投票:0回答:2

我创建了一个数据集,如下所示。

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'

我对此的理解可能有什么问题?

python-3.x lambda split list-comprehension
2个回答
1
投票

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


1
投票

你忽略了一个额外级别的循环,因为它不是由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])
© www.soinside.com 2019 - 2024. All rights reserved.