在Python中

时间:2017-11-18 20:51:56

标签: python pandas

我有一个数据框(可能是一个列表):

A = ['01', '20', '02', '25', '26']
B = ['10', '13', '14', '64', '32']

我想以下列方式将列表'a'与列表'b'进行比较:

enter image description here

如您所见,左栏中的数字字符串与右栏中的字符串进行比较。组合是具有相同边界数字的字符串,其中一个在合并期间(或之后)被移除。为什么删除字符串'010'?因为每个数字只能出现一次。

2 个答案:

答案 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:])