効率的に反復する方法は?
pandasデータフレームを本当に反復する必要がある場合は、おそらくiterrows()の使用を避けたいでしょう。さまざまな方法があり、通常の方法iterrows()
が最善とはほど遠い。itertuples()は100倍高速にできます。
要するに:
- 原則として、を使用してください
df.itertuples(name=None)
。特に、固定数の列があり、255列未満の場合。ポイント(3)を参照
- それ
df.itertuples()
以外の場合は、列にスペースや '-'などの特殊文字がある場合を除き、使用してください。ポイント(2)を参照
itertuples()
最後の例を使用すると、データフレームに奇妙な列がある場合でも使用できます。ポイント(4)を参照
iterrows()
以前のソリューションを使用できない場合にのみ使用してください。ポイント(1)を参照
パンダデータフレームの行を反復処理するさまざまな方法:
100万行、4列のランダムデータフレームを生成します。
df = pd.DataFrame(np.random.randint(0, 100, size=(1000000, 4)), columns=list('ABCD'))
print(df)
1)通常iterrows()
は便利ですが、すごく遅いです:
start_time = time.clock()
result = 0
for _, row in df.iterrows():
result += max(row['B'], row['C'])
total_elapsed_time = round(time.clock() - start_time, 2)
print("1. Iterrows done in {} seconds, result = {}".format(total_elapsed_time, result))
2)デフォルトitertuples()
はすでに高速ですが、次のような列名では機能しませんMy Col-Name is very Strange
(列が繰り返される場合、または列名を単純にpython変数名に変換できない場合は、このメソッドを回避する必要があります)。
start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
result += max(row.B, row.C)
total_elapsed_time = round(time.clock() - start_time, 2)
print("2. Named Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))
3)itertuples()
name = Noneを使用するデフォルトはさらに高速ですが、列ごとに変数を定義する必要があるため、あまり便利ではありません。
start_time = time.clock()
result = 0
for(_, col1, col2, col3, col4) in df.itertuples(name=None):
result += max(col2, col3)
total_elapsed_time = round(time.clock() - start_time, 2)
print("3. Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))
4)最後に、named itertuples()
は前のポイントよりも低速ですが、列ごとに変数を定義する必要はなく、などの列名で機能しますMy Col-Name is very Strange
。
start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
result += max(row[df.columns.get_loc('B')], row[df.columns.get_loc('C')])
total_elapsed_time = round(time.clock() - start_time, 2)
print("4. Polyvalent Itertuples working even with special characters in the column name done in {} seconds, result = {}".format(total_elapsed_time, result))
出力:
A B C D
0 41 63 42 23
1 54 9 24 65
2 15 34 10 9
3 39 94 82 97
4 4 88 79 54
... .. .. .. ..
999995 48 27 4 25
999996 16 51 34 28
999997 1 39 61 14
999998 66 51 27 70
999999 51 53 47 99
[1000000 rows x 4 columns]
1. Iterrows done in 104.96 seconds, result = 66151519
2. Named Itertuples done in 1.26 seconds, result = 66151519
3. Itertuples done in 0.94 seconds, result = 66151519
4. Polyvalent Itertuples working even with special characters in the column name done in 2.94 seconds, result = 66151519
この記事はiterrowsとitertuplesの非常に興味深い比較です