pandas 条件真假掩码变化值
pandas mask change value where condition true and false
我有一个值矩阵。我想对列中的值进行排名,然后将排名靠前的值设置为 1,将其他值设置为零。
我尝试使用 nlargest
、head
来做到这一点,但我能想到的唯一解决方案是应用 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
我有一个值矩阵。我想对列中的值进行排名,然后将排名靠前的值设置为 1,将其他值设置为零。
我尝试使用 nlargest
、head
来做到这一点,但我能想到的唯一解决方案是应用 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