python - 如何根据每行的多个最大值更新矩阵?

标签 python pandas dataframe matrix row

我是 Python 新手。我有一个 NxN 矩阵,我想知道每一行的最大值。接下来,我想取消(更新为零)除此最大值之外的所有其他值。如果该行包含多个最大值,则应保留所有这些最大值。

使用 DataFrame,我尝试获取每一行的最大值。然后我尝试获取这些最大值的索引。代码如下。

 matrix = [(22, 16, 23),
          (12, 6, 43),
          (24, 67, 11),
          (87, 9,11),
          (66, 36,66)
          ]
  dfObj = pd.DataFrame(matrix, index=list('abcde'), columns=list('xyz'))
  maxValuesObj = dfObj.max(axis=1)
  maxValueIndexObj = dfObj.idxmax(axis=1)

上面的代码没有考虑多个最大值。仅返回第一次出现。 另外,我坚持如何相应地更新矩阵。我的预期输出是:

matrix = [(0, 0, 23),
              (0, 0, 43),
              (0, 67, 0),
              (87, 0,0),
              (66, 0,66)
              ]

你能帮我解决这个问题吗?

最佳答案

使用 df.where() :

dfObj.where(dfObj.eq(dfObj.max(1),axis=0),0)

    x   y   z
a   0   0  23
b   0   0  43
c   0  67   0
d  87   0   0
e  66   0  66

对于 ND 数组而不是数据帧,调用 .values在上面的代码之后:

dfObj.where(dfObj.eq(dfObj.max(1),axis=0),0).values

或者更好的是to_numpy() :

dfObj.where(dfObj.eq(dfObj.max(1),axis=0),0).to_numpy()

np.where :

np.where(dfObj.eq(dfObj.max(1),axis=0),dfObj,0)

array([[ 0,  0, 23],
       [ 0,  0, 43],
       [ 0, 67,  0],
       [87,  0,  0],
       [66,  0, 66]], dtype=int64)

关于python - 如何根据每行的多个最大值更新矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513363/

相关文章:

python - 四舍五入到最接近的步长

Python OOP --action() 函数

python - 在 Python Pandas 中,如何像 R dplyr mutate_each 一样使用

python - 如果元素不包含在列表中,则从 pandas 列中删除元素

pandas - 变换 Pandas 数据框的形状

python - 将文件夹添加到 Python 库路径,一劳永逸 (Windows)

python - 在 Spyder 中关闭多行提示

python - DataFrame 每隔第三行并向前填充

python - 删除 pandas dataFrame 中给定列中具有唯一元素的行。 (独特是指重复一次)

r - data.table::fread 的 stringsAsFactors=TRUE 参数不会将字符列转换为因子类型 - 解决方法是什么?