我有一個包含 3 列的 Pandas 資料框。有一系列布林值、一系列值和我要填充的列 C。我還有 C 的初始值。
A B C
----------------------
True 10 100
False 20 NaN
True 25 NaN
True 28 NaN
...
我希望 C 列(對于 C[1:])的值遵循以下規則。
if A[i - 1]:
C[i] = C[i - 1] * B[i] / B[i - 1]
else:
C[i] = C[i - 1]
當然這個公式不能確定C[0],但是提供了C[0]。
有沒有辦法使用矢量化操作有效地做到這一點?
我試過的:
以下命令不考慮操作的順序性質。
df.loc[df.A , 'C'] = df.C.shift(1) * df.B / df.B.shift(1)
df.loc[df.A == 0, 'C'] = df.C.shift(1)
如果我要使用應用函式來計算它,我可能必須制作如下所示的新移位列,然后只對行 [1:] 運行應用?但是如何獲得更新后的 C 的先前值?
df["s_A"] = df.A.shift(1)
df["s_B"] = df.B.shift(1)
df["s_C"] = df.C.shift(1)
df["s_A"][0] = False; # this assumption is okay within the purposes
這應該有效嗎?有更快的方法嗎?跨多個資料幀總共可能有多達 400,000 行,但它不是超級時間敏感的。
為了清楚起見,我將提到總共大約 12 列,但只有這三列與此操作相關。
是否可以矢量化此操作?有沒有其他方法可以解決?
謝謝。
uj5u.com熱心網友回復:
我認為很難向量化遞回代數。
一般的方法是遞回地做
A = df['A'].to_numpy()
B = df['B'].to_numpy()
C = df['C'].to_numpy()
for i in np.arange(1, len(A)):
C[i] = C[i-1] if not A[i-1] else C[i-1] * B[i] / B[i-1]
df['A'] = A
df['B'] = B
df['C'] = C
或者,在分析您的案例后,可以將其視為累積產品問題,可以通過以下方式解決:
df['C'] = df['C'].fillna(
df['A'].shift(1) * df['B'] / df['B'].shift(1) \
(1 - df['A'].shift(1))
).cumprod()
兩種方式都會產生相同的結果。
A B C
0 True 10 100.0
1 False 20 200.0
2 True 25 200.0
3 True 28 224.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/433545.html
下一篇:為Pandas中的組分配唯一值
