熊猫在两列的一部分上合并

时间:2018-07-16 15:01:07

标签: python pandas merge

我有两个数据框,它们的公用列名为“ upc”,例如:

df1:

 upc 
 23456793749
 78907809834
 35894796324
 67382808404
 93743008374

df2:

 upc
 4567937
 9078098
 8947963
 3828084
 7430083

请注意,df2'upc'值是df1'upc'值的最里面的7个值。 请注意,df1和df2都有上面未显示的其他列。 我想做的是对'upc'进行内部合并,但仅对最里面的7个值进行合并。我该如何实现?

3 个答案:

答案 0 :(得分:3)

使用str.extact,将df1中的所有项目与df2匹配,然后将结果用作与df2的mergemerge

df1['keyfordf2']=df1.astype(str).upc.str.extract(r'({})'.format('|'.join(df2.upc.astype(str).tolist())),expand=True).fillna(False)


df1.merge(df2.astype(str),left_on='keyfordf2',right_on='upc')
Out[273]: 
         upc_x keyfordf2    upc_y
0  23456793749   4567937  4567937
1  78907809834   9078098  9078098
2  35894796324   8947963  8947963
3  67382808404   3828084  3828084
4  93743008374   7430083  7430083

答案 1 :(得分:3)

1)创建两个数据框并转换为字符串类型。

2)pd。合并两个框架,但是使用left_on关键字访问“ upc”系列的内部7个字符

df1 = pd.DataFrame(data=[ 
 23456793749,
 78907809834,
 35894796324,
 67382808404,
 93743008374,], columns = ['upc1'])
df1 = df1.astype(str)

df2 = pd.DataFrame(data=[ 
 4567937,
 9078098,
 8947963,
 3828084,
 7430083,], columns = ['upc2'])
df2 = df2.astype(str)

pd.merge(df1, df2, left_on=df1['upc1'].astype(str).str[2:-2], right_on='upc2', how='inner')

Out[5]: 
          upc1     upc2
0  23456793749  4567937
1  78907809834  9078098
2  35894796324  8947963
3  67382808404  3828084
4  93743008374  7430083

答案 2 :(得分:1)

您可以在df1中创建一个新列,然后在该列上合并。

import pandas as pd
df1= pd.DataFrame({'upc': [ 23456793749, 78907809834, 35894796324, 67382808404, 93743008374]})
df2= pd.DataFrame({'upc': [ 4567937, 9078098, 8947963, 3828084, 7430083]})

df1['upc_old'] = df1['upc'] #in case you still need the old (longer) upc column
df1['upc'] = df1['upc'].astype(str).str[2:-2].astype(int)

merged_df = pd.merge(df1, df2, on='upc')