修改我的熊猫数据框的最快方法是什么?

时间:2019-12-09 05:51:29

标签: python pandas dataframe apply

数据框具有122,145行。 以下是数据片段:

country_name,subdivision_1_name,subdivision_2_name,city_name
Spain,Madrid,Madrid,Sevilla La Nueva
Spain,Principality of Asturias,Asturias,Sevares
Spain,Catalonia,Barcelona,Seva
Spain,Cantabria,Cantabria,Setien
Spain,Basque Country,Biscay,Sestao
Spain,Navarre,Navarre,Sesma
Spain,Catalonia,Barcelona,Barcelona

只要同时满足以下两个条件,我想用subvision_2_name替换city_name:

  1. subdivision_2_name和city_name具有相同的country_name和相同的 subdivision_1_name和
  2. subdivision_2_name位于city_name中。

ex:对于city_name“ Seva”,在数据框中,subdivison_2_name“ Barcelona”也作为city_name出现在具有相同country_name“ Spain”和subdivision_1_name“ Catalonia”的数据框中,因此我将“ Seva”替换为“ Barcelona”

我能够创建适当的Apply函数。我已经准备好一个循环:

for i in range(df.shape[0]):
    if df.subdivision_2_name[i] in set(df.city_name[(df.country_name == df.country_name[i]) & (df.subdivision_1_name == df.subdivision_1_name[i])]):
        df.city_name[i] = df.subdivision_2_name[i]

编辑:此循环耗时1637秒(〜28分钟)

建议我采用更好的方法。

1 个答案:

答案 0 :(得分:0)

使用:

def f(x):
    if x['subdivision_2_name'].isin(x['city_name']).any():
        x['city_name'] = x['subdivision_2_name']
    return (x)

df1 = df.groupby(['country_name','subdivision_1_name','subdivision_2_name']).apply(f)
print (df1)
  country_name        subdivision_1_name subdivision_2_name         city_name
0        Spain                    Madrid             Madrid  Sevilla La Nueva
1        Spain  Principality of Asturias           Asturias           Sevares
2        Spain                 Catalonia          Barcelona         Barcelona
3        Spain                 Cantabria          Cantabria            Setien
4        Spain            Basque Country             Biscay            Sestao
5        Spain                   Navarre            Navarre             Sesma
6        Spain                 Catalonia          Barcelona         Barcelona