Python 3.x 这个等式中的Lambda和list理解

Python 3.x 这个等式中的Lambda和list理解,python-3.x,lambda,split,list-comprehension,Python 3.x,Lambda,Split,List Comprehension,我创建了一个数据集,如下所示 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

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

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
然而,我对apply中的函数很好奇。它基本上迭代列车数据帧的特征列中的值。之后,它拆分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)
将打印: 基础知识 艾德
CDF

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)
将打印: 基础知识 艾德
CDF

有一个额外的循环级别,您忽略了它,因为它不是通过数据帧上的
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])

您忽略了一个额外的循环级别,因为它不是通过数据帧上的
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])