【问题标题】:How to fill columns based on other column values?如何根据其他列值填充列?
【发布时间】:2021-06-19 02:34:13
【问题描述】:

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

请帮忙!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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在内部做循环,不需要自己做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多