Python 从包含数组的不同列之间的匹配元素创建新列
我有一个数据框,col2列的行包含数字列表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
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”