私はPythonデータフレームを反復処理しており、非常に遅いと判断しています。私はパンダですべてをベクトル化しようとしていることを理解していますが、この場合は具体的に反復する必要があります(ベクトル化することが可能な場合は、どうすればよいかわかりません)。前の行を参照しながらpandasデータフレームを反復処理する方法はありますか?
ロジックは単純です.2つの列「A」と「B」と結果列「signal」があります。 Aが1の場合は、信号を1に設定します.Bが1の場合は、信号を0に設定します。それ以外の場合は、信号は以前のものと同じになります。言い換えると、列Aは「オン」信号であり、列Bは「オフ」信号であり、「信号」は状態を表す。ここで
が私のコードです:
def signals(indata):
numrows = len(indata)
data = pd.DataFrame(index= range(0,numrows))
data['A'] = indata['A']
data['B'] = indata['B']
data['signal'] = 0
for i in range(1,numrows):
if data['A'].iloc[i] == 1:
data['signal'].iloc[i] = 1
elif data['B'].iloc[i] == 1:
data['signal'].iloc[i] = 0
else:
data['signal'].iloc[i] = data['signal'].iloc[i-1]
return data
例入力/出力:
indata = pd.DataFrame(index = range(0,10))
indata['A'] = [0, 1, 0, 0, 0, 0, 1, 0, 0, 0]
indata['B'] = [1, 0, 0, 0, 1, 0, 0, 0, 1, 1]
signals(indata)
出力:
A B signal
0 0 1 0
1 1 0 1
2 0 0 1
3 0 0 1
4 0 1 0
5 0 0 0
6 1 0 1
7 0 0 1
8 0 1 0
9 0 1 0
この単純な論理は、データフレーム上で実行するために46秒私のコンピュータを取りますランダムに生成されたデータを含む2000行の
パンダがこの論理ゲート操作をどのように処理したかを観察することは興味深いです。 –
これは本当にきちんとしています、あなたはもう少し詳しく説明できますか? – DJK
これは興味深い解決策ですが、私はより複雑な反復のために自分自身でそのロジックを思いつくことはできません。私は実際にこの種の問題の処理時間を短縮する簡単で簡単に複製可能な方法を探しています。 – karakumy