私は多くの行を持つデータフレームを持っています。私はこのようなカスタム関数から生成されたデータを使用して列を、追加しています:それは正常に動作しているPandas、列値の一意のサブセットに基づいて列を追加します
import numpy
df['new_column'] = numpy.vectorize(fx)(df['col_a'], df['col_b'])
# takes 180964.377 ms
、私は何をしようとしていますが、それをスピードアップです。実際にはcol_a
とcol_b
というユニークな組み合わせの小さなグループしかありません。反復の多くは冗長です。私はたぶんpandas
がそれだけでそれを理解するだろうと思っていたが、そうは思わない。冗長データがたくさんあるので、(私は何をしようとしていますが、大きなデータフレームを更新している、
df_unique['new_column'] = numpy.vectorize(fx)(df_unique['col_a'], df_unique['col_b'])
# takes 14611.357 ms
:私もこれを実行することによって可能スピードアップの自分自身を納得させ
print len(df.index) #prints 127255
df_unique = df.copy().drop_duplicates(['col_a', 'col_b'])
print len(df_unique.index) #prints 9834
:これを考えてみましょうdf
127255行)、最小限の回数(9834回)のfx
関数を実行するだけで済みます。これは、すべての重複行がcol_a
とcol_b
のためです。もちろん、col_a
とcol_b
の値が同じdf
に複数の行がありますが、それはOKです。df
の他の列は異なるため、各行が一意になります。
私はdf_unique
データフレームをループにループの反復ノーマルを作成し、df
上の条件付きのアップデートを行う前に、私は更新のこの種を行うより、「神託」きちんとした方法があったかお聞きしたかったのです。どうもありがとう。
** UPDATE **
私はこのような、上記のループのための簡単な作成:
は、このforループを持つのでdf = ...
df_unique = df.copy().drop_duplicates(['col_a', 'col_b'])
df_unique['new_column'] = np.vectorize(fx)(df_unique['col_a'], df_unique['col_b'])
for index, row in df_unique.iterrows():
df.loc[(df['col_a'] == row['col_a']) & (df['col_b'] == row['col_b']),'new_column'] = row['new_column']
# takes 165971.890
わずかな性能向上があるかもしれないではなく、ほとんど私は希望期待しています。
FYI
これはfx
機能です。それはmysqlデータベースを照会します。
def fx(d):
exp_date = datetime.strptime(d.col_a, '%m/%d/%Y')
if exp_date.weekday() == 5:
exp_date -= timedelta(days=1)
p = pandas.read_sql("select stat from table where a = '%s' and b_date = '%s';" % (d.col_a,exp_date.strftime('%Y-%m-%d')),engine)
if len(p.index) == 0:
return None
else:
return p.iloc[0].close
「col_a」、「col_b」にはどのような種類のデータがありますか?彼らはすでに分類されていますか? – ptrj
これらは両方とも文字列ですが、col_bは日付文字列です。かなり彼らはソートされていることを確認します。彼らはそうであるように見えます。 –