我想转换Pandas数据帧的值,以便将例如最小的3列设置为零:
row1: 0.21, 0.11, 0.24, 0.52, 0.12
row2: 0.31, 0.01, 0.44, 0.52, 0.52
将变成:
row1: 0.0, 0.0, 0.24, 0.52, 0.0
row2: 0.0, 0.0. 0.0, 0.52, 0.52
我更愿意这样做而不需要循环。
我们可以在axis=1
上使用where
+rank
。具有method='min'
和ascending=False
的rank
将在该行内建立排序,使得最小值为1,最大值为5(该行的总长度(。然后,我们使用where
来替换秩小于3:的所有值
df = df.where(df.rank(axis=1, method='min', ascending=False) < 3, 0)
我们也可以使用与mask
相反的条件来保持排名高于3的值,并将排名低于3的值替换为0:
df = df.mask(df.rank(axis=1, method='min', ascending=False) >= 3, 0)
任一选项都会产生df
:
0 1 2 3 4
0 0.0 0.0 0.24 0.52 0.00
1 0.0 0.0 0.00 0.52 0.52
*注意,根据所需的行为,我们可能还需要method='dense'
或method='first'
,这将改变在排名中处理重复值的方式。
设置:
import pandas as pd
df = pd.DataFrame({
0: [0.21, 0.31],
1: [0.11, 0.01],
2: [0.24, 0.44],
3: [0.52, 0.52],
4: [0.12, 0.52]
})
您可以尝试:
A-使用list(df[quot;col"].unique(((并进行排序以获得前三个值。把它放到一个列表里。
B-使用df.loc删除此新列表中具有值的行(类似df.loc[df["col"].isin(a(](