python - df.loc 打印出错误的期望值

标签 python python-3.x pandas 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 行没有包括在内?我试过其他范围,其中一些也没有达到预期的效果。这是索引的问题吗?

最佳答案

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

关于python - df.loc 打印出错误的期望值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75255303/

相关文章:

python - 如何将 python 比较 ast 节点转换为 c?

python - 银行账户客户python

python - Pandas - 用最少听过的艺术家过滤用户

python-2.7 - 如何在matplotlib中控制科学计数法?

python - 根据值从 DataReader 中选择行并传输到 DataFrame

python - 遇到两个单独的关键字后跳出for循环

python - 为什么 myHDL 手册中的这个示例给出了不同的结果?

python - 如何在Redis中保存复杂的数据结构?

python-3.x - 在 Python 3 中,当我索引字节数组时会发生什么?

Python 3,如何用打印清除行以进行覆盖?