我正在遍歷Python數據框並發現它非常慢。我明白,在Pandas中,你試圖對所有東西進行矢量化,但在這種情況下,我特別需要迭代(或者如果可以矢量化,我不清楚如何去做)。如何在引用前一行時迭代熊貓數據框?
邏輯很簡單:您有兩列「A」和「B」以及結果列「信號」。如果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