我有2个数据帧df1和df2。我的两个数据框都有一个名为“ zip_code”的列,我想在这些列上加入df1和df2。
问题是,在df2中,有时'zip_code'列中的字符串开头缺少一个'0'。但是我希望熊猫能够发现它们具有“相同”的价值。
有没有一种方法可以在不预处理我的数据的情况下进行?
答案 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
中的邮政编码,然后按常规合并。