我有一个看起来像这样的数据框:
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/