行を反復処理するときに一部の列値を更新したいが、時間がかかりすぎる。私は、iterrows()
の代わりにhereとhereを使用し、1回の反復で2つの列を更新したいので、apply
関数を使用することはできません。Python Pandas:行の反復処理中にDataFrame値を更新する
私のケースでは、以下のコードとは無関係の10列以上の列が含まれているので、私は単純な例を使用します。ここにそれらを含めると、コードが悪化します。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 5, size=(90000, 4)),
columns=['Initial', 'A', 'B'])
df['code'] = list('KLMNOP' * 15000) # Adding column 'code'
df = df.sort_values('code') # Sorting the df by 'code'
df['Total'] = np.nan
そして、IはA
とB
の値に基づいて、カラムInitial
とTotal
を更新したい、その後、前の行のTotal
によってInitial
を更新します。 Iは電流code
コード前の行のcode
def produce_total(init, a, b):
if a >= 2 and b >= 2:
return init + 1
return init
last_code = ''
last_total = -100
for row in df.itertuples():
# Print the current checkpoint
if(row.Index % 1000 == 0):
print row.Index
# Carry over the prev Total to current Initial
if last_code == row.code:
df.loc[row.Index, 'Initial'] = last_total
# Prepare the updated Initial value
# Because what is inside 'row' seems unaffected by the update
new_initial = df.loc[row.Index, 'Initial']
# Find Total and assign to the df
new_total = produce_total(
new_initial,
row.A,
row.B
)
df.loc[row.Index, 'Total'] = new_total
last_code = row.code
last_total = new_total
に等しい場合Total
が次の行のInitial
に持ち越され、平均はほぼ時間走ったが、唯一のインデックス30000-ISH達します。これを行うためのもう1つまたは2つの効率的な方法のためのアイデアや提案?
または、私が考慮する必要がある他の側面があります(いくつかの列の削除など)?
ありがとうございます!