与大熊猫一起加入

时间:2018-07-05 15:24:16

标签: python string pandas join merge

我有2个数据帧df1和df2。我的两个数据框都有一个名为“ zip_code”的列,我想在这些列上加入df1和df2。

问题是,在df2中,有时'zip_code'列中的字符串开头缺少一个'0'。但是我希望熊猫能够发现它们具有“相同”的价值。

有没有一种方法可以在不预处理我的数据的情况下进行?

4 个答案:

答案 0 :(得分:2)

我认为建议进行预处理,如果不需要的话。否则,当您合并时,您将获得带有2个邮政编码的行,一个以'0'开头,而另一个则不是。

您可以根据掩码更新df2中有问题的邮政编码。我假设两个zip_code系列都被投射为str

# prefixing with 0 causes a zip_code match with df1
mask = ('0' + df2['zip_code']).isin(df1['zip_code'].unique())

# apply the prefix for these cases
df2.loc[mask, 'zip_code'] = '0' + df2.loc[mask, 'zip_code']

然后像往常一样执行合并。

答案 1 :(得分:1)

这将是冗长的,并且假设所有邮政编码在开头添加0后将具有相同的长度。

import pandas as pd
import numpy as np

t1 = pd.DataFrame({'id':[1,2,3,4],
                 'zip_code':['0234','0345','3456','4567']})

t2 = pd.DataFrame({'id2':[5,6,7,8],
                 'zip_code':['234','0345','3456','4567']})

t2['lens'] = t2.zip_code.apply(len)

t2.loc[:,'zip_code'] = np.where(t2.lens<4,'0'+t2['zip_code'].astype(str),t2['zip_code'])

输入t1:

    id  zip_code
0   1   0234
1   2   0345
2   3   3456
3   4   4567

输入t2:

    id2 zip_code
0   5   234
1   6   0345
2   7   3456
3   8   4567

输出t2:

    id2 zip_code    lens
0   5   0234    3
1   6   0345    4
2   7   3456    4
3   8   4567    4

如果以后不需要,可以删除镜头列。现在,您可以使用zip_code连接两个数据帧t1和t2。

答案 2 :(得分:0)

只需使用DataFrame的联接功能

import pandas as pd

A = pd.DataFrame(
    {
        'zip_code':[1000,1001,2000,2002],
        'place':['A','A','B','B']
    }
)

B = pd.DataFrame(
    {
        'Name':['x','y','z'],
        'zip_code':[1001,1000,2000]

})
B['zip_code'] = [x.lstrip('0') for x in B['zip_code']]
B.join(A.set_index('zip_code'), on='zip_code')

答案 3 :(得分:0)

在这种情况下,Series.str.zfill()对于预处理非常有用。

import pandas as pd
df = pd.DataFrame({'zip5': ['1', '12', '123', '1234', '12345', '123456']})

df.zip5.str.zfill(5)
#0     00001
#1     00012
#2     00123
#3     01234
#4     12345
#5    123456
#Name: zip5, dtype: object

这不会影响任何大于或等于5个字符的邮政编码,并且会用前导零填充所有内容,在这种情况下,最多为5个字符。您可以使用它来更新df2中的邮政编码,然后按常规合并。