Pandas Dataframe的Clean方法,将每行中最低的n个值设置为零



我想转换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=Falserank将在该行内建立排序,使得最小值为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(](

最新更新