我有一个数据框(可能是一个列表):
A = ['01', '20', '02', '25', '26']
B = ['10', '13', '14', '64', '32']
我想以下列方式将列表'a'与列表'b'进行比较:
如您所见,左栏中的数字字符串与右栏中的字符串进行比较。组合是具有相同边界数字的字符串,其中一个在合并期间(或之后)被移除。为什么删除字符串'010'?因为每个数字只能出现一次。
答案 0 :(得分:1)
您可以执行几个字符串切片操作,然后在公共数字上合并。
a
A
0 01
1 20
2 02
3 25
4 26
b
B
0 10
1 13
2 14
3 64
4 32
a['x'] = a.A.str[-1]
b['x'] = b.B.str[0]
b['B'] = b.B.str[1:]
m = a.merge(b)
您也可以使用assign
在一行中执行此操作,而不会中断原始数据框:
m = a.assign(x=a.A.str[-1]).merge(b.assign(x=b.B.str[0], B=b.B.str[1:]))
对于唯一身份证,您需要转换为set
并检查其长度。
v = (m['A'] + m['B'])
v.str.len() == v.apply(set).str.len()
0 False
1 True
2 True
3 True
dtype: bool
v[v.str.len() == v.apply(set).str.len()].tolist()
['013', '014', '264']
答案 1 :(得分:0)
你应该注意的是你实际上传递的是整数,而不是字符串。这意味着A = [01, 20, 02, 25, 26]
与A = [1, 20, 2, 25, 26]
相同。但是,如果你总是知道你将使用整数< = 99,那么这不会成为一个问题。否则,您应该使用字符串而不是整数,例如A = ['01', '20', '02', '25', '26']
。所以你要做的第一件事就是将列表转换为字符串列表。如果你知道所有的整数都是< = 99,你可以这样做:
A = ['%02d' % i for i in A]
B = ['%02d' % i for i in B]
(如果要保留整数列表,也可以将这些内容命名为不同的名称)。那么这就是解决方案:
final = []
for i in A:
for j in B:
if i[-1] == j[0]:
final.append(i + j[1:])