簡體   English   中英

熊貓用行中的值替換列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM