簡體   English   中英

修改我的熊貓數據框的最快方法是什么?

[英]What is the fastest way to modify my pandas dataframe?

數據框有 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

只要滿足以下兩個條件,我就想用 subdivision_2_name 替換 city_name:

  1. subdivision_2_name 和 city_name 具有相同的 country_name 和相同的 subdivision_1_name ,並且
  2. subdivision_2_name 存在於 city_name 中。

例如:對於 city_name "Seva", subdivison_2_name "Barcelona" 也作為 city_name 出現在具有相同 country_name "Spain" 和相同 subdivision_1_name "Catalonia" 的數據框中,因此我將用 "Barcelona" 替換 "Seva"。

我能夠創建一個適當的應用函數。 我准備了一個循環:

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 分鍾)

給我推薦一個更好的方法。

用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM