如何替换数据框熊猫中最大值的第一个实例?

kin*_*s23 5 python dataframe pandas

我有一个如下所示的数据框:

NAME   MONTH  TIME
Paul    Jan     3
Paul    Sept    1
Joe      Jan    3
Joe     Aug     3
Run Code Online (Sandbox Code Playgroud)

我使用pivot将其转换为像这样的df:

NAME JAN SEPT AUG 
Paul  3    1   0
Joe   3    0   3
Run Code Online (Sandbox Code Playgroud)

现在我正在创建一个新列,其中每行都有最大值,它看起来像这样:

NAME JAN SEPT AUG 1_MAX
Paul  3    1   0    3
Joe   3    0   3    3
Run Code Online (Sandbox Code Playgroud)

然后,我将临时数据框中的 0 分配给旧的最大值,现在获得第二大值,如下所示:

NAME JAN SEPT AUG 1_MAX 2_MAX
Paul  3    1   0    3     1
Joe   3    0   3    3     3
Run Code Online (Sandbox Code Playgroud)

但是因为 Joe 在 1 月和 8 月有 2 乘以 3,当我将 0 分配给最大的一个时,对于 JAN 来说应该是 3,这是第一次出现最大值,它会更改为 0 所有最大实例。变成这样,这不是我想要的:

NAME JAN SEPT AUG 1_MAX 2_MAX
Paul  3    1   0    3     1
Joe   3    0   3    3     0
Run Code Online (Sandbox Code Playgroud)

我在用着:

f_temp1 = df_temp1.apply(lambda x: x.replace(max(x), 0), axis = 1)
Run Code Online (Sandbox Code Playgroud)

将最大值更改为零,但这会替换所有最大值,我想在第一次出现时替换该行的最大值。

我需要一个通用的解决方案,因为我正在处理一个大数据框。

ans*_*sev 2

使用:

df[['1_MAX','2_MAX']]=(df.loc[:,'JAN':]
                         .apply(lambda x: pd.Series(np.sort(np.unique(x))[-2:]),
                                axis=1)
                         .loc[:,[1,0]])
print(df)
   NAME  JAN  SEPT  AUG  1_MAX  2_MAX
0  Paul    3     1    0      3      1
1   Joe    3     0    3      3      0
Run Code Online (Sandbox Code Playgroud)

初始df

   NAME  JAN  SEPT  AUG
0  Paul    3     1    0
1   Joe    3     0    3
Run Code Online (Sandbox Code Playgroud)