我试图从数据框中获取 zipcode 数据,以填充另一个缺少 NaN 邮政编码值的数据框。我使用街道名称和地址的数字来搜索最佳的邮政编码匹配,但我的功能仅在硬编码值时才有效。
以下是第一个数据帧的虚拟数据:
sufixo = ['ST', 'ST', 'AV', 'ST', 'AV']
logradouro = ['JEFF', '9TH', 'CRAZY', 'SEXY', 'TEST']
number = [123, 444, 1204, 40, 55]
zipcode = [None, None, None, None, None]
dataset = list(zip(sufixo, logradouro, number, zipcode))
df = pd.DataFrame(data=dataset, columns=['suffix', 's_name', 'number', 'zipcode'])
现在是第二个:
street_name = ['CRAZY AV', 'SEXY ST', '9TH ST', 'JEFF ST', 'TEST AV', 'CRAZY AV', 'SEXY ST', 'TEST AV']
number = [100, 23, 666, 24, 54, 1200, 39, 100]
zipcode = [11122, 11133, 11166, 11100, 11144, 11155, 11199, 11177]
dataset = list(zip(street_name, number, zipcode))
df2 = pd.DataFrame(data=dataset, columns=['street_name', 'number', 'zipcode'])
获取最近数字的功能:
def find_nearest(array, value):
idx = (np.abs(array-value)).idxmin()
return array[idx]
连接街道名称的功能:
def concat_st_name(row):
return row['s_name'] + " " + row['suffix']
df['combo_name'] = df.apply(concat_st_name, axis=1)
我失败的功能试图获得一个像样的邮编:
def zip_finder(row):
return df2['zipcode'][(df2['street_name'] == row['combo_name']) &
(df2['number'] == find_nearest(df2[df2['street_name'] == row['combo_name']]['number'], row['number']))]
尝试使用df['ziptest'] = df.apply(zip_finder, axis=1)
我得到了:ValueError: Wrong number of items passed 5, placement implies 1
如果我之前使用0'生成ziptest
列,我会得到一个新的数据框:
我是Pandas的新手,我认为我未能理解 apply 方法的逻辑。
答案 0 :(得分:0)
IIUC,你可以使用merge_asof
df['street_name']=df['s_name'] + " " + df['suffix']
pd.merge_asof(df.sort_values('number').drop('zipcode',1),df2.sort_values('number'),by='street_name',on='number',direction ='nearest')
Out[1176]:
suffix s_name number street_name zipcode
0 ST SEXY 40 SEXY ST 11199
1 AV TEST 55 TEST AV 11144
2 ST JEFF 123 JEFF ST 11100
3 ST 9TH 444 9TH ST 11166
4 AV CRAZY 1204 CRAZY AV 11155