web-dev-qa-db-ja.com

データフレームを1つずつループする(パンダ)

列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ステートメントはその特定の行を参照する必要があります。

4
Bondeaux

効率的に反復する方法は?

pandas dataframeを本当に反復する必要がある場合は、おそらくiterrows()の使用を避けるです。さまざまな方法と通常のiterrows()があります。 itertuples()は100倍速くなる場合があります。

簡単に言うと

  • 原則として、df.itertuples(name=None)を使用します。特に、固定数の列があり、255列未満の場合。 参照点(3)
  • それ以外の場合は、列に ''や '-'などの特殊文字がある場合を除いて、df.itertuples()を使用します。 ポイント(2)を参照
  • 最後の例を使用すると、データフレームに奇妙な列がある場合でもitertuples()を使用できます。 (4)を参照してください
  • iterrows()を使用できるのは、以前の解決策を使用できない場合のみです。 ポイント(1)を参照

pandasデータフレームを反復するさまざまな方法:

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
_

この記事はiterrowsとitertuplesの非常に興味深い比較です

0
Romain Capron