列A、B、Cのデータフレームがあるとします。
df = pd.DataFrame(columns =('A','B','C'), index=range(1))
列には3行の数値が保持されます。
0 A B C
1 2.1 1.8 1.6
2 2.01 1.81 1.58
3 1.9 1.84 1.52
どのようにして、1から3までのすべての行をループし、変数の追加を含むifステートメントを実行しますか。
if B1 > 1.5
calc_temp = A1*10
calc_temp01 = C1*-10
if B2 > 1.5
calc_temp = A2*10
calc_temp01 = C2*-10
if B3 >1.5
calc_temp = A3*10
calc_temp01 = C3*-10
上記は可能ですか?それはある種の種類の範囲、つまり何らかの種類のカウンターを備えた全範囲のデータセット番号を知っている必要がありますか? ifステートメントはその特定の行を参照する必要があります。
pandas dataframeを本当に反復する必要がある場合は、おそらくiterrows()の使用を避けるです。さまざまな方法と通常のiterrows()
があります。 itertuples()は100倍速くなる場合があります。
簡単に言うと
df.itertuples(name=None)
を使用します。特に、固定数の列があり、255列未満の場合。 参照点(3)df.itertuples()
を使用します。 ポイント(2)を参照itertuples()
を使用できます。 (4)を参照してくださいiterrows()
を使用できるのは、以前の解決策を使用できない場合のみです。 ポイント(1)を参照0)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)name = Noneを使用するデフォルトのitertuples()
はさらに高速ですが、列ごとに変数を定義する必要があるため、あまり便利ではありません。
_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)最後に、名前付き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
_