我有一个 df,我想在其中查询邮政编码以匹配地址和城市。
Postalcodestring
1181
1055
8547
我为此使用了 nomi.query_postal_code('n')。特此,当输入以下表格时:
postal_code 1181
country_code NL
place_name Amstelveen
state_name Noord-Holland
state_code 7
county_name Amstelveen
county_code 362
community_name NaN
community_code NaN
latitude 52.31
longitude 4.8631
accuracy 6
Name: 0, dtype: object
我想为“City1”和“Country1”列填充城市和国家以填充邮政编码的每一行。当邮政编码为 n/a 时,我希望 City1 和 Country1 行也为 N/A!
我尝试了以下代码:
#NL
for i, row in df.iterrows():
df.loc[i, 'City1'] = nomi.query_postal_code(df['Postalcodestring'][i])[2]
#DE
for i, row in df.iterrows():
df.loc[i,'City2'] = nomi2.query_postal_code(df['Postalcodestring'][i])[2]
#NLCountry
for i, row in df.iterrows():
df.loc[i,['Country1']] = nomi.query_postal_code(df['Postalcodestring'][i])[1]
#DECountry
for i, row in df.iterrows():
df.loc[i,'Country2'] = nomi2.query_postal_code(df['Postalcodestring'][i])[1]
但是,得到以下错误:
ValueError Traceback (most recent call last)
<ipython-input-80-d0d96a6ea61b> in <module>
67 #NL
68 for i, row in df.iterrows():
---> 69 df.loc[i, 'City1'] = nomi.query_postal_code(df['Postalcodestring'][i])[2]
70 #DE
71 for i, row in df.iterrows():
ValueError: DataFrame constructor not properly called!
所需的输出:
Postalcodestring City1
1181 Amstelveen
1055 Amsterdam
8547 NaN
请帮忙!
答案 0 :(得分:1)
您应该使用 df.apply
方法:
import pandas as pd
import pgeocode
df = pd.DataFrame({'Postalcodestring': ['1181', '1055', '8547']})
nomi = pgeocode.Nominatim('nl')
df['City1'] = df['Postalcodestring'].apply(lambda code: nomi.query_postal_code(code)['place_name'])
当您可以改用 df[COL].apply
将函数应用于列的每一行时,实际上没有必要逐行循环。正如您在我的代码中看到的,您将函数作为参数传递给 apply 方法。就我而言,我使用 lambda 函数在同一个表达式中定义函数,但您也可以在外部显式定义函数:
def get_city(code):
return nomi.query_postal_code(code)['place_name']
df['City1'] = df['Postalcodestring'].apply(get_city)
旁注:不要混淆,因为我的代码不使用循环。当然,在多行上执行这样的操作需要循环。只是 df.apply
在内部执行循环,因此您无需自己执行。