2016-11-13 13 views
1

私は自分のプログラムでこの関数を使用していますが、より良い性能を研究しているものはベクトル化によって実現できます。Python Pandas iterrowsとset_valueをベクトル化関数

以下のコードを使用するのではなく、ベクトル化された関数を使用して同じ解像度を達成するにはどうすればよいですか?

for i, row in df.iterrows(): 
    ifor_val = something 
    if <condition>: 
     ifor_val = something_else 
     df.set_value(i,'ifor',ifor_val) 

答えて

3

値が行の他の値に依存する場合は、反復処理を避けることはできません。

df['ifor'] = df['some_col'].apply(lambda v: something if <condition> else something_else) 

これはPandasに反復を入れているので、はるかにクリーンで(おそらく高速です)。

+0

私は現在、数多くの異なる条件で数万行のループを処理しており、データフレームの他の列に基づいて値を設定しています。これは非常に迅速に面倒なようです。 –

+1

行から複数​​の値が必要な場合は、 'df.apply(func、axis = 1)'を使用して、各行(順番に1つずつ)をパラメータとして呼び出します私の例が示すように、列の値)。あなたが渡す関数は、必要に応じて複雑にすることができます。ラムダである必要はありません。 – cco

+0

正規表現と一緒にベクトル化された関数を使用して、指定された列内の一致を識別し、正規表現によって識別された一致を取り、別の列に値を設定する可能性はありますか? –

2

(ので、それを使用していないIXでも動作しますが、それは廃止される予定)あなたはLOCとブールインデックスを使用することができます。これは、条件を満たし、設定ifor列から行を選択します

df.loc[condition, 'ifor'] = something_else 

その値はsomething_elseになります。

+0

@cco "値が行の他の値に依存する場合、反復を避けることはできません" これは私のケースです - 行の異なる列の内容を引き出して列 ' ifor' ...上記の方法で各行の 'index'と' column'値にアクセスする方法がありますか? –

関連する問題