Python 只替换熊猫中数据帧行的第一个最大值?
我在尝试替换(0)dataframe中最大值的第一个实例时遇到问题。 例如: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
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)