代码之家  ›  专栏  ›  技术社区  ›  madsthaks

如果dataframe行为1,其余值为0,如何设置最大值

  •  4
  • madsthaks  · 技术社区  · 7 年前

    原始数据帧:

    ix x  y  z    
    0  3  4  1 
    1  2  0  6
    2  7  1  0
    3  0  0  0
    

    应转化为:

    ix x  y  z    
    0  0  1  0 
    1  0  0  1
    2  1  0  0
    3  0  0  0
    

    如您所见,我在每一行中取最大值并将其设置为1,那么该行中的其他值将等于0。而且,你会注意到那一排 3 保持不变,因为它们都等于0。

    所以,我可以使用以下方法提取最大值的索引:

    x.idxmax(axis = 1)
    

    但我不知道该怎么处理最大指数。我在想用np,但我不能用条件语句。我也这么认为。

    任何帮助都将不胜感激。

    4 回复  |  直到 7 年前
        1
  •  3
  •   Scott Boston    7 年前

    使用:

    df.eq(df.where(df != 0).max(1), axis=0).astype(int)
    

    其中df,

          x    y    z
    ix               
    0   3.0  4.0  1.0
    1   2.0  1.0  6.0
    2   7.0  1.0  6.0
    3   0.0  0.0  0.0
    4   4.0  0.0  4.0
    

    输出:

        x  y  z
    ix         
    0   0  1  0
    1   0  0  1
    2   1  0  0
    3   0  0  0
    4   1  0  1
    

    另一种方法使用 rank 以下内容:

    df.where(df!=0).rank(1, ascending=False, method='dense').eq(1).astype(int)
    

    输出:

    X Y Z轴
    九
    0 0 1 0
    1 0 0 1
    2 1 0 0
    3 0 0 0
    4 1 0 1
    
        2
  •  4
  •   DYZ    7 年前

    首先,找到数据帧中包含非零行的部分。然后找出最大值,并将它们与矩阵进行比较:

    affected = (df != 0).any(axis=1)
    nz = df[affected]
    df[affected] = (nz.T == nz.max(axis=1)).T.astype(int)
    #    x  y  z
    #0   0  1  0
    #1   0  0  1
    #2   1  0  0
    #3   0  0  0
    
        3
  •  1
  •   willeM_ Van Onsem    7 年前

    一种相当不雅的做法是:

    (df.T.max() == df.T).T.astype(int)
    

    在这里我们计算 顺时针 最大值,然后将其与值进行比较(将这些值设置为 True / False ),下一步我们将其转换为 int S.

    这将产生:

    >>> (df.T.max() == df.T).T.astype(int)
       a  b  c
    0  0  1  0
    1  0  0  1
    2  1  0  0
    

    这个 .T 是必要的,因为这将计算 柱状 最大值。

    或者像Achampion说的,我们可以计算 行最大值 具有 .max(axis=1) 然后使用 df.eq(..) 也要按行计算等式。比如:

    >>> df.eq(df.max(axis=1), axis=0).astype(int)
       a  b  c
    0  0  1  0
    1  0  0  1
    2  1  0  0
    

    编辑 :仅更新非零行

    例如,我们可以使用掩蔽来防止将这些值赋给零行。例如:

    fl = (df != 0).any(axis=1)
    df[fl] = df[fl].eq(df[fl].max(axis=1), axis=0).astype(int)
    

    例如:

    >>> df = pd.DataFrame([[3, 4, 1], [2, 1, 6], [7, 1, 6], [0, 0, 0]], columns=["a", "b", "c"])
    >>> fl = (df != 0).any(axis=1)
    >>> df[fl] = df[fl].eq(df[fl].max(axis=1), axis=0).astype(int)
    >>> df
       a  b  c
    0  0  1  0
    1  0  0  1
    2  1  0  0
    3  0  0  0