0

国、製品コード、年の3つのカテゴリに階層的にインデックス付けされた約3,700万のデータポイントのかなり大きなデータセットを使用しています。国変数(国名)は、次のような項目で構成されるかなり乱雑なデータです。「オーストラリア」を表す「オーストラリア」。文字と単語を照合し、country_namesの既知のリストから最良の推測と信頼区間を返す単純なguess_country()を作成しました。データの長さと階層の性質を考えると、Series:countryに.map()を使用することは非常に非効率的です。[guess_country関数は約2ms/リクエストかかります]

私の質問は次のとおりです。シリーズを取得し、一意の値のみでマップを実行する、より効率的な.map()はありますか?(繰り返される国名がたくさんあるとすると)

4

3 に答える 3

3

ありませんが、一意の値にのみ適用したい場合は、自分で行ってください。GetmySeries.unique()を取得し、関数を使用して、それらの一意の値のマップされた代替を事前に計算し、結果のマッピングで辞書を作成します。次にmap、辞書で pandas を使用します。これは、期待できる速度とほぼ同じである必要があります。

于 2013-03-15T05:41:50.687 に答える
0

guess_country()一意の国名を呼び出しcountry_map、元の名前をインデックスとして、変換された名前を値として使用してSeriesオブジェクトを作成します。次に、を使用country_map[df.country]して変換を行うことができます。

import pandas as pd
c = ["abc","abc","ade","ade","ccc","bdc","bxy","ccc","ccx","ccb","ccx"]
v = range(len(c))
df = pd.DataFrame({"country":c, "data":v})

def guess_country(c):
    return c[0]

uc = df.country.unique()
country_map = pd.Series(list(map(guess_country, uc)), index=uc)
df["country_id"] = country_map[df.country].values
print(df)
于 2013-03-15T07:51:58.527 に答える
0

解決策は、DataFrame で階層型インデックスを利用することです。

data = data.set_index(keys=['COUNTRY', 'PRODUCTCODE', 'YEAR'])
data.index.levels[0] = pd.Index(data.index.levels[0].map(lambda x: guess_country(x, country_names)[0])) 

これはうまく機能します... data.index.levels[0] を置き換えることにより -> COUNTRY がインデックスのレベル 0 の場合、置換はデータ モデルを介して伝播します。

于 2013-03-15T05:46:40.103 に答える