繁体   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