使用其他数据框中的信息填充列

时间:2018-03-27 03:34:18

标签: python pandas dataframe

我试图从数据框中获取 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列,我会得到一个新的数据框:my failure exposed

我是Pandas的新手,我认为我未能理解 apply 方法的逻辑。

1 个答案:

答案 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