如何根据其他列值填充列?

时间:2021-03-22 12:38:17

标签: python pandas dataframe

我有一个 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

请帮忙!

1 个答案:

答案 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 在内部执行循环,因此您无需自己执行。