[英]Pandas replace column by value in row
如何通過在行中查找值來向量化替換。
對於如下數據框:
df = pd.DataFrame([(1, 2, 3, 4, np.NaN, np.NaN, 4),
(1, 2, 3, 0, 0, np.NaN, 0),
(1, 2, 3, 4, 5, np.NaN, 5)],
columns = ['P0', 'P1', 'P2', 'P3', 'P4', 'P5', 'Last_not_NaN_value'],
index = ['row1', 'row2', 'row3'])
輸出df:
P0 P1 P2 P3 P4 P5 Last_not_NaN_value
row1 1 2 3 4 NaN NaN 4
row2 1 2 3 0 0.0 NaN 0
row3 1 2 3 4 5.0 NaN 5
我該怎么做
df.replace(df['Last_not_NaN_value'], 0 )
<-不執行任何操作。
如何查找last_not_NaN_value
在df中的位置,並將其替換為0,例如:
P0 P1 P2 P3 P4 P5 Last_not_NaN_value
row1 1 2 3 *0* NaN NaN 4
row2 1 2 3 0 *0* NaN 0
row3 1 2 3 4 *0* NaN 5
根據要求進行向量化。 執行廣播比較,找到替換索引,然后進行相應替換。 然后,您可以使用整潔的df[:] = ...
技巧將結果分配回去。
v = df.values
i = v[:, :-1]
j = v[:, -1]
v[np.arange(v.shape[0]), (i == j[:, None]).argmax(axis=1)] = 0
df[:] = v
df
P0 P1 P2 P3 P4 P5 Last_not_NaN_value
row1 1.0 2.0 3.0 0.0 NaN NaN 4.0
row2 1.0 2.0 3.0 0.0 0.0 NaN 0.0
row3 1.0 2.0 3.0 4.0 0.0 NaN 5.0
這是一種解決方案,盡管沒有向量化:
for i in range(6):
df.loc[i==(df['Last_not_NaN_value']-1), 'P'+str(i)] = 0
# P0 P1 P2 P3 P4 P5 Last_not_NaN_value
# row1 1 2 3 0 NaN NaN 4
# row2 1 2 3 0 0.0 NaN 0
# row3 1 2 3 4 0.0 NaN 5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.