我有一个数据框:
a b c d
0 M11 18 1 1.00
1 M11 17 1 1.00
2 M12 16 2 0.90
3 M12 15 2 0.90
4 S11 15 2 0.90
5 S2 13 3 0.85
6 M21 14 3 0.80
7 S21 14 3 0.80
8 M2 13 3 0.70
9 M22 12 3 0.70
10 S22 12 3 0.70
11 M31 11 4 0.65
12 S31 11 4 0.65
13 M3 10 4 0.60
14 A31 10 4 0.60
15 M32 9 4 0.55
16 S32 9 4 0.55
17 M41 8 4 0.50
18 S41 8 4 0.50
19 M42 7 4 0.45
20 S42 7 4 0.45
21 M43 6 4 0.40
22 S43 6 4 0.40
23 A51 5 4 0.35
24 A52 5 4 0.35
25 T51 5 4 0.35
26 T52 5 4 0.35
27 A53 4 4 0.30
28 T53 4 4 0.30
我想在“a”列的特定值之间打印“d”值
我试过了
df.loc[df['a'].between('T52', 'T53'), 'd']
在'a'行T52和T53之间打印'd'
我以为
26 0.35
27 0.30
28 0.30
但实际结果是:
26 0.35
28 0.30
为什么第 27 行没有包括在内?我试过其他范围,其中一些也没有达到预期的效果。这是索引的问题吗?
最佳答案
df['a'].between('T52', 'T53')
将检查 a
中的每个值是否按字典顺序在 T51
和 T53
之间,与行的相对顺序无关
你可能更想:
m = df['a'].isin(['T52', 'T53'])
df[m.cummax() & m[::-1].cummax()]
输出:
a b c d
26 T52 5 4 0.35
27 A53 4 4 0.30
28 T53 4 4 0.30
中间体:
a b c d between m cummax reversed_cummax &
0 M11 18 1 1.00 False False False True False
1 M11 17 1 1.00 False False False True False
2 M12 16 2 0.90 False False False True False
3 M12 15 2 0.90 False False False True False
4 S11 15 2 0.90 False False False True False
5 S2 13 3 0.85 False False False True False
6 M21 14 3 0.80 False False False True False
7 S21 14 3 0.80 False False False True False
8 M2 13 3 0.70 False False False True False
9 M22 12 3 0.70 False False False True False
10 S22 12 3 0.70 False False False True False
11 M31 11 4 0.65 False False False True False
12 S31 11 4 0.65 False False False True False
13 M3 10 4 0.60 False False False True False
14 A31 10 4 0.60 False False False True False
15 M32 9 4 0.55 False False False True False
16 S32 9 4 0.55 False False False True False
17 M41 8 4 0.50 False False False True False
18 S41 8 4 0.50 False False False True False
19 M42 7 4 0.45 False False False True False
20 S42 7 4 0.45 False False False True False
21 M43 6 4 0.40 False False False True False
22 S43 6 4 0.40 False False False True False
23 A51 5 4 0.35 False False False True False
24 A52 5 4 0.35 False False False True False
25 T51 5 4 0.35 False False False True False
26 T52 5 4 0.35 True True True True True
27 A53 4 4 0.30 False False True True True
28 T53 4 4 0.30 True True True True True
或者,如果您多次出现 T52/T53 并且想要每行之间的所有行,请使用:
m = df['a'].map({'T52': True, 'T53': False}).ffill().fillna(False)
out = df.loc[m|m.shift()]
示例输入:
a b c d
0 M11 18 1 1.00
1 M11 17 1 1.00
2 M12 16 2 0.90
3 M12 15 2 0.90
4 T52 15 2 0.90 #
5 S2 13 3 0.85 # Group 1
6 M21 14 3 0.80 #
7 T53 14 3 0.80 #
8 M2 13 3 0.70
9 S42 7 4 0.45
10 M43 6 4 0.40
11 S43 6 4 0.40
12 A51 5 4 0.35
13 A52 5 4 0.35
14 T51 5 4 0.35
15 T52 5 4 0.35 #
16 A53 4 4 0.30 # Group 2
17 T53 4 4 0.30 #
输出:
a b c d
4 T52 15 2 0.90
5 S2 13 3 0.85
6 M21 14 3 0.80
7 T53 14 3 0.80
15 T52 5 4 0.35
16 A53 4 4 0.30
17 T53 4 4 0.30
关于python - df.loc 打印出错误的期望值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75255303/