pandas 条件真假掩码变化值

pandas mask change value where condition true and false

我有一个值矩阵。我想对列中的值进行排名,然后将排名靠前的值设置为 1,将其他值设置为零。

我尝试使用 nlargesthead 来做到这一点,但我能想到的唯一解决方案是应用 mask 两次。

我的解决方案如下,但是有没有更聪明的方法来做到这一点?

非常感谢

约翰

import pandas as pd
df = pd.DataFrame([(1, 2, 3),
                   (4, 5, 6),
                   (7, 8, 9),
                   (11, 21, 31),
                   (41, 51, 31),
                   (71, 51, 61),
                   (71, 81, 91)],
                  columns=('value_1','value_2','value_3'))

value_1 value_2 value_3
0 1 2 3
1 4 5 6
2 7 8 9
3 11 21 31
4 41 51 31
5 71 51 61
6 71 81 91
N = 3 # arbitrary cut off
df = df.rank(ascending=False, axis=0, method='min')
df.mask(df > N, 0, inplace=True)
df.mask(df > 0, 1, inplace=True) # i.e. values not previously masked

结果df

value_1 value_2 value_3
0 0 0 0
1 0 0 0
2 0 0 0
3 0 0 1
4 1 1 1
5 1 1 1
6 1 1 1

尝试创建布尔值,然后使用 astype

(~(df.rank(ascending=False, axis=0, method='min') > N)).astype(int)

   value_1  value_2  value_3
0        0        0        0
1        0        0        0
2        0        0        0
3        0        0        1
4        1        1        1
5        1        1        1
6        1        1        1