Python 只替换熊猫中数据帧行的第一个最大值?

Python 只替换熊猫中数据帧行的第一个最大值?,python,pandas,dataframe,Python,Pandas,Dataframe,我在尝试替换(0)dataframe中最大值的第一个实例时遇到问题。 例如: NAME 1ST MONTH 2ND MONTH 3RD MONTH.... Joe 3 3 2 Erik 5 7 7 我只需要替换df中每一行的最大值的第一个实例。 我需要的输出是: NAME 1ST MONTH 2ND MONTH 3RD MONTH.... Joe

我在尝试替换(0)dataframe中最大值的第一个实例时遇到问题。 例如:

NAME   1ST MONTH    2ND MONTH   3RD MONTH....
Joe        3            3            2
Erik       5            7            7
我只需要替换df中每一行的最大值的第一个实例。 我需要的输出是:

NAME   1ST MONTH    2ND MONTH   3RD MONTH....
Joe        0            3            2
Erik       5            0            7
但我用的是:

df_temp1.apply(lambda x: x.replace(max(x), 0), axis = 1)
这给了我以下的df:

NAME   1ST MONTH    2ND MONTH   3RD MONTH....
Joe        0            0            2
Erik       5            0            0

您可以这样做,希望有更优雅的解决方案:

to_zero = df_temp1._get_numeric_data().idxmax(axis=1).to_dict()

for idx, col in to_zero.items()
    df_temp1.loc[idx, col] = 0

df_temp1

NAME   1ST MONTH    2ND MONTH   3RD MONTH....
Joe        0            3            2
Erik       5            0            7
你可以用


为了提高性能,可以将
numpy
用于第一个最大值的位置,然后通过索引设置
0

arr = df.to_numpy()
#oldier pandas versions
#arr = df.values
arr[np.arange(len(df)), np.argmax(arr, axis=1)] = 0
print (arr)
[[0 3 2]
 [5 0 7]]

df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
      1ST MONTH  2ND MONTH  3RD MONTH....
NAME                                     
Joe           0          3              2
Erik          5          0              7


表现重要吗?
arr = df.to_numpy()
#oldier pandas versions
#arr = df.values
arr[np.arange(len(df)), np.argmax(arr, axis=1)] = 0
print (arr)
[[0 3 2]
 [5 0 7]]

df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
      1ST MONTH  2ND MONTH  3RD MONTH....
NAME                                     
Joe           0          3              2
Erik          5          0              7
#small DataFrame 2k rows
df = pd.concat([df] * 1000, ignore_index=True)


In [174]: %%timeit
     ...: df.apply(lambda x: x.replace(x.nlargest(1), 0), axis=1)
     ...: 
     ...: 
3.11 s ± 311 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [175]: %%timeit
     ...: to_zero = df.idxmax(axis=1).to_dict()
     ...: 
     ...: for idx, col in to_zero.items():
     ...:     df.loc[idx, col] = 0
     ...:     
1.07 s ± 41.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [176]: %%timeit
     ...: arr = df.to_numpy()
     ...: arr[np.arange(len(df)), np.argmax(arr, axis=1)] = 0
     ...: pd.DataFrame(arr, index=df.index, columns=df.columns)
     ...: 
213 µs ± 5.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)