pandas df.loc打印错误的预期值

4jb9z9bj  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(114)

我有一个 Dataframe :

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行没有包括?我已经尝试了其他范围,其中一些也没有得到预期的结果.这是索引的问题吗?

hc2pp10m

hc2pp10m1#

df['a'].between('T52', 'T53')

将检查a中的每个单个值是否按字典顺序介于T51T53之间,而与行的相对顺序无关
您可能希望:

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
dbf7pr2w

dbf7pr2w2#

如果始终匹配数据中的startend值,则可以通过DataFrame.loc进行过滤,并通过Series.idxmax将开始值和结束值与第一个匹配值进行比较:

start = 'T52'
end = 'T53'

df = df.loc[df['a'].eq(start).idxmax() : df['a'].eq(end).idxmax(), 'd']
print (df)
26    0.35
27    0.30
28    0.30
Name: d, dtype: float64
qlzsbp2j

qlzsbp2j3#

between并没有给出这些值之间的行,而是按字母顺序给出了这些值之间的行。

df['a'].between('T52','T53')

并查看哪些行返回True
文件:https://pandas.pydata.org/docs/reference/api/pandas.Series.between.html
参见文档中的底部示例以获得相关示例。

相关问题