python - 如何仅替换数据帧 Pandas 中最大值的第一个实例?

标签 python pandas dataframe

我有一个看起来像这样的数据框:

NAME   MONTH  TIME
Paul    Jan     3
Paul    Sept    1
Joe      Jan    3
Joe     Aug     3

我使用pivot将其转换为这样的df:
NAME JAN SEPT AUG 
Paul  3    1   0
Joe   3    0   3

现在我正在为每一行创建一个具有最大值的新列,它看起来像这样:
NAME JAN SEPT AUG 1_MAX
Paul  3    1   0    3
Joe   3    0   3    3

然后,我将临时数据框中的 0 分配给旧的最大值,现在获得第二大值,如下所示:
NAME JAN SEPT AUG 1_MAX 2_MAX
Paul  3    1   0    3     1
Joe   3    0   3    3     3

但是因为乔有 2 次 3,在 1 月和 8 月,当我将 0 分配给最大的一个时,JAN 应该是 3,这是第一次出现最大值,它更改为 0 所有最大实例。
它变成了这样,这不是我想要的:
NAME JAN SEPT AUG 1_MAX 2_MAX
Paul  3    1   0    3     1
Joe   3    0   3    3     0

我正在使用:
f_temp1 = df_temp1.apply(lambda x: x.replace(max(x), 0), axis = 1)

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

我需要一个通用的解决方案,因为我在一个大数据框中工作。

最佳答案

使用 numpy 到 sort底层数组(假设 'Name' 在索引中)并连接最大值。

import pandas as pd
import numpy as np
N = 2

pd.concat([df, pd.DataFrame(np.sort(df.to_numpy(), axis=1)[:, -N:],
                            index=df.index,
                            columns=[f'{i}_MAX' for i in range(N, 0, -1)])],
           axis=1)
      JAN  SEPT  AUG  2_MAX  1_MAX
NAME                              
Paul    3     1    0      1      3
Joe     3     0    3      3      3

关于python - 如何仅替换数据帧 Pandas 中最大值的第一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793144/

相关文章:

r - 更改 R 中多个 data.frame 对象中的单列名称

python - 带有实例的模型不会保存到数据库,但 Django 中没有错误消息

Python- Mechanize : Why does it need CookieJar?

python - 在 Windows 上为 Python 安装 Pillow

python - 如何从具有时间戳范围的 pandas 对象获取不同的组

python max() 函数在 pandas 列上使用时失败并且整数失败

python - 迭代循环并将列表添加到新行或新列中的数据框

python - 减去 pandas 数据框中的两列

python - XGBoost:特征名称不匹配

python - 将不同的列值堆叠到 Pandas 数据框中的一列中