Python 从包含数组的不同列之间的匹配元素创建新列

Python 从包含数组的不同列之间的匹配元素创建新列,python,arrays,pandas,for-loop,Python,Arrays,Pandas,For Loop,我有一个数据框,col2列的行包含数字列表 col1 col2 1 . 54319 54319, 54317 2 . 54317 37604, 37603, 37605 3 . 37603 123 4 . 37604 124 5 . 37605 1255 我想查找col1和col2之间的匹配项,并创建一个新列“new”,将包含与col1匹配项的col2中的组追加到后面 结果 col1 col2 new

我有一个数据框,col2列的行包含数字列表

    col1   col2

1 . 54319    54319, 54317
2 . 54317    37604, 37603, 37605
3 . 37603    123
4 . 37604    124
5 . 37605    1255
我想查找col1和col2之间的匹配项,并创建一个新列“new”,将包含与col1匹配项的col2中的组追加到后面

结果

    col1   col2                    new

1 . 54319    54319, 54317          54319, 54317
2 . 54317    37604, 37603, 37605   54319, 54317
3 . 37603    123                   37604, 37603, 37605
4 . 37604    124                   37604, 37603, 37605
5 . 37605    1255                  37604, 37603, 37605
这是我的代码,但它崩溃了。我想我看不懂col2[行]行中包含的列表

new = []
for val in col1:
    for i in col2:
        if val in i:
           new.append(i)
        else:
           continue

打印(新)

如果在
col2
中匹配
col1
值,则Idea是ltest,对于通用解决方案,返回默认值,如果值不存在,则此处
不匹配

f = lambda x: next(iter([y for y in df['col2'].tolist() if str(x) in y]), 'no match')
df['new'] = df['col1'].apply(f)
print (df)
   col1                 col2                  new
1   123       123, 562, 7779       123, 562, 7779
2   456        456, 111, 123        456, 111, 123
3   789       667, 1213, 456  1011, 444, 909, 789
4  1011  1213, 445, 909, 123  1011, 444, 909, 789
5  1213  1011, 444, 909, 789       667, 1213, 456
同样适用于值列表:

df['new'] = df['col1'].apply(f)
print (df)
   col1                   col2                    new
1   123       [123, 562, 7779]       [123, 562, 7779]
2   456        [456, 111, 123]        [456, 111, 123]
3   789       [667, 1213, 456]  [1011, 444, 909, 789]
4  1011  [1213, 445, 909, 123]  [1011, 444, 909, 789]
5  1213  [1011, 444, 909, 789]       [667, 1213, 456]
编辑:

使用
拆分的最后一个解决方案使用

df['col2'] = df['col2'].str.split(', ')
f = lambda x: next(iter([y for y in df['col2'].tolist() if str(x) in y]), 'no match')
df['new'] = df['col1'].apply(f)
print (df)
    col1                   col2                    new
1  54319         [54319, 54317]         [54319, 54317]
2  54317  [37604, 37603, 37605]         [54319, 54317]
3  37603                  [123]  [37604, 37603, 37605]
4  37604                  [124]  [37604, 37603, 37605]
5  37605                 [1255]  [37604, 37603, 37605]

嗨,有了。谢谢!我可以问一下lambda函数中的下一个()是什么吗?@Annalix-当然,如果列表为空,这是获取第一个值的技巧。尝试
a=[]
print(a[0])
失败,因为不是值<代码>a=[8,7,5]
打印(a[0])
工作。如果使用
a=next(iter(a),“”)
两个列表的工作-空和非空。谢谢,全部清除。还有一个问题。如果col2包含NaN,它仍然有效吗?我有一本书。AttributeError:“DataFrame”对象没有属性“tolist”