如果数据框行设置为1,其余值设置为0,如何设置最大值

原始数据框:


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.where,但是没有可以使用的条件语句。还是我想。


任何帮助将非常感激。


至尊宝的传说
浏览 225回答 3
3回答

森林海

用:df.eq(df.where(df != 0).max(1), axis=0).astype(int)df      x    y    zix               0   3.0  4.0  1.01   2.0  1.0  6.02   7.0  1.0  6.03   0.0  0.0  0.04   4.0  0.0  4.0输出:    x  y  zix         0   0  1  01   0  0  12   1  0  03   0  0  04   1  0  1另一种方法使用rank:df.where(df!=0).rank(1, ascending=False, method='dense').eq(1).astype(int)输出:    x  y  zix         0   0  1  01   0  0  12   1  0  03   0  0  04   1  0  1

MYYA

首先,找到数据框中具有非零行的部分。然后找到最大值并将它们与矩阵进行比较: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

慕容3067478

做到这一点的一种不太雅致的方法是:(df.T.max() == df.T).T.astype(int)在这里,我们计算按行的最大值,然后将其与值进行比较(将其设置为True/ False),然后将其转换为ints。这将产生:>>> (df.T.max() == df.T).T.astype(int)   a  b  c0  0  1  01  0  0  12  1  0  0该.T是必要的,因为这将另有计算纵列最大。或就像@AChampion所说的那样,我们可以使用计算行的最大值,.max(axis=1)然后使用df.eq(..)来计算行的相等性。喜欢:>>> df.eq(df.max(axis=1), axis=0).astype(int)   a  b  c0  0  1  01  0  0  12  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  c0  0  1  01  0  0  12  1  0  03  0  0  0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python