質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3168閲覧

python pandasの抽出速度を上げたい

moto_saka

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/09 04:01

dfのID,codeからdf_mergedの条件に合致し、更に条件に合致するかどうかをTrue or False
でリストで取得する場合、コード自体は下記のコードで動くのですが速度が遅いです。
速度を早くするにはどうしたら良いかご教授頂けたらと思います。
df,df_mergedの「code」にはリストが入っております。
「code」に入っているリストは必ずID2の値のいずれかが入っております。

def serch(x,y): if len(y) > 0: serch = df_merged[(df_merged.ID == x) & (df_merged.ID2 == y[0])] if ((serch['yoso1'] > 3) & (serch['yoso2'] <= 3)).values: choice = True else: choice = False else: choice = False return choice kekka = [serch(x,y) for x, y in zip(df['ID'], df['code'])]

df_mergedの例
ID|ID2|code|yoso1|yoso2|
|:--|:--:|--:|
|'06A'|'5055'|['1002','36D5','332']|5|2|
|'08B'|'32B6'|[]|12|10|
|'5894'|'199'|['5055','50A0']|3|10|
|'6641G'|'50A0'|['1002','1066','332','76K4']|1|9|

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手っ取り早く高速化するのであれば、これで多少は早くなると思いますが、、、

python

1# import numpy as np が必須です 2 3def serch(x,y): 4 if len(y) > 0: 5 serch = df_merged[(df_merged.ID == x) & (df_merged.ID2 == y[0])] 6 if ((serch['yoso1'] > 3) & (serch['yoso2'] <= 3)).values: 7 choice = True 8 else: 9 choice = False 10 else: 11 choice = False 12 return choice 13 14# これは使わない 15# kekka = [serch(x,y) for x, y in zip(df['ID'], df['code'])] 16 17# 以下のみ、追記変更 18# frompyfunc の第2引数は serch メソッドの引数の数 19# 第3引数は serch メソッドの戻り値の数 20pyfunc_serch = np.frompyfunc(serch, 2, 1) 21kekka = pyfunc_serch(df['ID'], df['code'])

注意点としては、kekkaが配列ではなくて、numpy配列になっていることです


提示はしたものの、上記の方法は、個人的には裏技というか抜け道的なやり方だと感じています。

np.whereや、
実際に使っていらっしゃる以下のような処理

df_merged[(df_merged.ID == x) & (df_merged.ID2 == y[0])]
((serch['yoso1'] > 3) & (serch['yoso2'] <= 3))

を駆使して上手くデータを生成する方が、まっとうというか一般的な方法だと感じます。

(手間がかかるので、サンプルを提示することは控えさせていただきますが...)

投稿2019/11/10 02:03

編集2019/11/10 02:10
siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto_saka

2019/11/10 07:34

ありがとうございます。 新しいやり方を模索してましたので参考にさせて頂きます。
siruku6

2019/11/10 08:42

勉強熱心な方に感じましたので、こちらも紹介しておきます https://teratail.com/questions/214134 私もこれくらいできるようになりたいのですが、私以外の方がpandasの高速化のため、かなり手の込んだことをされています 高速化の最低ラインとしては、少なくとも dataframe や ndarray 、 series を loopさせることだけは避けると良さそうです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問