私はIPをとる関数find_country_from_connection_ip
を持っていて、ある処理が国を返します。以下のように:パンダ:IPを国に解決する最速の方法
def find_country_from_connection_ip(ip):
# Do some processing
return county
私はapply
メソッドの内部機能を使用しています。以下のように:
df['Country'] = df.apply(lambda x: find_country_from_ip(x['IP']), axis=1)
それはとても簡単なので、私が欲しいのは>400000
行を持つデータフレーム内の既存の列から新しい列を評価することです。
それが実行されますが、ひどく遅いと以下のような例外をスロー:
ドキュメントの注意事項を参照してください[row_indexer、col_indexer] =値の代わりに...........:SettingWithCopyWarning: 値はAのコピーに設定されるようにしようとしていますDataFrameからスライスします。 http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
かの名前 == 'メイン':[38]で :
の.locを使用してみてください
私はこの問題を理解していますが、loc
とapply
とlambda
をどのように使用するかを理解できません。
N.B.より効果的な代替ソリューションがあれば、最終結果をもたらす可能性があることをお勧めします。
**** EDIT
********機能は主に以下のようなmmdb
データベースの検索です:これは、それにもかかわらず、コストのかかる作業である
def find_country_from_ip(ip):
result = subprocess.Popen("mmdblookup --file GeoIP2-Country.mmdb --ip {} country names en".format(ip).split(" "), stdout=subprocess.PIPE).stdout.read()
if result:
return re.search(r'\"(.+?)\"', result).group(1)
else:
final_output = subprocess.Popen("mmdblookup --file GeoIP2-Country.mmdb --ip {} registered_country names en".format(ip).split(" "), stdout=subprocess.PIPE).stdout.read()
return re.search(r'\"(.+?)\"', final_output).group(1)
、そしてあなた>400000
行のDataFrameがある場合は、時間がかかるはずです。しかし、どれくらい?それが問題です。それはかなり私が思う約2時間かかります。
私はより効率的なソリューションは、 '省略apply'、可能であれば機能をベクトル化、いくつかのパンダにカスタム関数を書き換えることができると思います。 – jezrael
これで、すべての関数 'find_country_from_ip'に質問することができますか? – jezrael
@jezrael、編集中。あなたは今見ているかもしれません。 –