私は、郵便番号、都市、州、およそ600,000の場所のパンダデータフレームを持っています。さんはmy_dfそれを呼ぼうパンダのデータフレーム検索のスピードアップ
私が対応する経度と緯度これらの場所のそれぞれのためを検索したいと思います。ありがたいことに、thisのデータベースがあります。このデータフレームをzipdbと呼ぶことにしましょう。
zipdb
は、とりわけ、郵便番号、都市、州および国の列を持ちます。 zipdb
ですべての場所(郵便番号、市町村、州、国)を検索したいと思います。
def zipdb_lookup(zipcode, city, state, country):
countries_mapping = { "UNITED STATES":"US"
, "CANADA":"CA"
, "KOREA REP OF":"KR"
, "ITALY":"IT"
, "AUSTRALIA":"AU"
, "CHILE":"CL"
, "UNITED KINGDOM":"GB"
, "BERMUDA":"BM"
}
try:
slc = zipdb[ (zipdb.Zipcode == str(zipcode)) &
(zipdb.City == str(city).upper()) &
(zipdb.State == str(state).upper()) &
(zipdb.Country == countries_mapping[country].upper()) ]
if slc.shape[0] == 1:
return np.array(slc["Lat"])[0], np.array(slc["Long"])[0]
else:
return None
except:
return None
私はパンダ.apply
だけでなく、これを行うためのfor
ループを試してみました。 どちらも非常に遅いです。私は行数が多いことを認識していますが、私は助けることはできませんが、より速いものが可能でなければならないと考えています。
zipdb = pandas.read_csv("free-zipcode-database.csv") #linked to above
注:私もzibdb
にこの変換を行ってきました:
zipdb["Zipcode"] = zipdb["Zipcode"].astype(str)
関数コール:
#Defined a wrapper function:
def lookup(row):
"""
:param row:
:return:
"""
lnglat = zipdb_lookup(
zipcode = my_df["organization_zip"][row]
, city = my_df["organization_city"][row]
, state = my_df["organization_state"][row]
, country = my_df["organization_country"][row]
)
return lnglat
lnglat = list()
for l in range(0, my_df.shape[0]):
# if l % 5000 == 0: print(round((float(l)/my_df.shape[0])*100, 2), "%")
lnglat.append(lookup(row = l))
からの
サンプルデータ:
organization_zip organization_city organization_state organization_country
0 60208 EVANSTON IL United Sates
1 77555 GALVESTON TX United Sates
2 23284 RICHMOND VA United Sates
3 53233 MILWAUKEE WI United Sates
4 10036 NEW YORK NY United Sates
5 33620 TAMPA FL United Sates
6 10029 NEW YORK NY United Sates
7 97201 PORTLAND OR United Sates
8 97201 PORTLAND OR United Sates
9 53715 MADISON WI United Sates
どのように関数を呼び出していますか? – ayhan
DataFrameとzipdbを結合するために 'join'または' merge'を使ってみましたか? – BrenBarn
@ayhan質問を更新しました。 – lnNoam