python - Pandas 用行中的值替换列

标签 python pandas

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

对于数据框如下:

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

关于python - Pandas 用行中的值替换列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48883106/

相关文章:

python - 需要计算数据框中的负值

python - 当类别是多字符串中的单个字符时创建虚拟对象

python - 如何根据其他列值动态填充列值?

python - 识别 pandas 中具有稀疏 nan 的时间序列中的数据组

python - 没有参数/可迭代的函数的多处理池?

python - 突出显示 Excel 列中大于某个值的总和

python - 如何删除聚类图中的 x 和 y 轴标签?

python - Pandas 在 Linux 中失败,在 Windows 中没有发生 - 缺少数据属性

python - 如何使用Python脚本或其他方式美化所有文件?

python - 为什么 PyMongo 将 uuid.uuid1() 编码为 BSON::Binary?