Pandas在中用值替换列

2024-04-20 05:09:46 发布

您现在位置:Python中文网/ 问答频道 /正文

如何通过在行中查找值来对替换进行矢量化。在

对于以下数据帧:

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:

^{pr2}$

我怎么能做像

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

Tags: dfvaluenpnotnanlastrow1row2
2条回答

按要求矢量化。进行广播比较,找到替换的索引,然后进行相应的替换。然后,您可以使用一个简洁的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

相关问题 更多 >