我正在try 遍历数据框以提取特定值.我有一个循环来说明条件,但我无法避免索引器越界错误.

我的循环是:

new_end = []
for i in range(size):
if fifo.Same_New.iloc[i] == "New" and fifo.Same_New.iloc[i-1] == "New":
    new_end.append(fifo.EndTime.iloc[i])
else:
    if fifo.Same_New.iloc[i] == 'Same' and fifo.Same_New.iloc[i+1] =="New":
        new_end.append(fifo.EndTime.iloc[i])
    else:
        new_end.append('Null')

示例df:

StartTime       EndTime                 Dura    Diff    S/N         
05/01/2024 12:27    05/01/2024 13:04    2224    1036    New
06/01/2024 07:05    06/01/2024 07:06    60      1081    New
06/01/2024 07:06    06/01/2024 07:06    0       0       Same
08/01/2024 10:26    08/01/2024 10:27    32      200     New
08/01/2024 11:45    08/01/2024 11:46    38      78      New
09/01/2024 13:48    09/01/2024 13:51    172     122     New
09/01/2024 16:41    09/01/2024 16:42    60      170     New
09/01/2024 16:43    09/01/2024 17:37    3267    1       Same
09/01/2024 17:38    09/01/2024 17:41    189     1       Same
10/01/2024 10:06    10/01/2024 10:08    142     985     New
10/01/2024 10:51    10/01/2024 10:53    116     43      New
10/01/2024 11:00    10/01/2024 11:00    26      7       New
12/01/2024 12:17    12/01/2024 12:30    752     77      New
15/01/2024 08:01    15/01/2024 08:01    36      1171    New
16/01/2024 15:44    16/01/2024 15:53    577     463     New
16/01/2024 16:43    16/01/2024 17:16    2003    50      New
16/01/2024 17:16    16/01/2024 17:17    69      0       Same
17/01/2024 00:03    17/01/2024 00:04    60      406     New
17/01/2024 00:04    17/01/2024 00:20    943     0       Same
17/01/2024 06:08    17/01/2024 06:09    16      348     New

其逻辑是:

  1. 如果您必须将第1行和第2行都在S/N列中具有相同的值,则从第1行返回EndTime值.示例如下:
    05/01/2024 12:27    05/01/2024 13:04    2224    1036    New
    06/01/2024 07:05    06/01/2024 07:06    60      1081    New
  1. 如果第1行的S/N列中有"New"值,第2行的S/N列中有"Same"值,则返回"".示例如下:
    09/01/2024 16:41    09/01/2024 16:42    60      170     New
    09/01/2024 16:43    09/01/2024 17:37    3267    1       Same
  1. 如果第一行在S/N列中具有"相同"值,而第二行在S/N列中具有"相同"值,则返回"空".示例如下:
    09/01/2024 16:43    09/01/2024 17:37    3267    1       Same
    09/01/2024 17:38    09/01/2024 17:41    189     1       Same
  1. 如果第一行在S/N列中的值相同,而第二行在S/N列中的值为新的,则返回第一行的结束时间值.示例如下:
    16/01/2024 17:16    16/01/2024 17:17    69      0       Same
    17/01/2024 00:03    17/01/2024 00:04    60      406     New

预期输出将是具有以下值的附加列:

StartTime           EndTime          Dura Diff  S/N     N_E
05/01/2024 12:27    05/01/2024 13:04 2224 1036  New     05/01/2024 13:04
06/01/2024 07:05    06/01/2024 07:06 60   1081  New     Null
06/01/2024 07:06    06/01/2024 07:06 0    0     Same    06/01/2024 07:06
08/01/2024 10:26    08/01/2024 10:27 32   200   New     08/01/2024 10:27
08/01/2024 11:45    08/01/2024 11:46 38   78    New     08/01/2024 11:46
09/01/2024 13:48    09/01/2024 13:51 172  122   New     09/01/2024 13:51
09/01/2024 16:41    09/01/2024 16:42 60   170   New     Null
09/01/2024 16:43    09/01/2024 17:37 3267 1     Same    Null
09/01/2024 17:38    09/01/2024 17:41 189  1     Same    09/01/2024 17:41
10/01/2024 10:06    10/01/2024 10:08 142  985   New     10/01/2024 10:08
10/01/2024 10:51    10/01/2024 10:53 116  43    New     10/01/2024 10:53
10/01/2024 11:00    10/01/2024 11:00 26   7     New     10/01/2024 11:00
12/01/2024 12:17    12/01/2024 12:30 752  77    New     12/01/2024 12:30
15/01/2024 08:01    15/01/2024 08:01 36   1171  New     15/01/2024 08:01
16/01/2024 15:44    16/01/2024 15:53 577  463   New     16/01/2024 15:53
16/01/2024 16:43    16/01/2024 17:16 2003 50    New     Null
16/01/2024 17:16    16/01/2024 17:17 69   0     Same    16/01/2024 17:17
17/01/2024 00:03    17/01/2024 00:04 60   406   New     Null
17/01/2024 00:04    17/01/2024 00:20 943  0     Same    17/01/2024 00:20
17/01/2024 06:08    17/01/2024 06:09 16   348   New     17/01/2024 06:09
17/01/2024 06:09    17/01/2024 06:10 30   0     Same    Null

希望它能澄清这一点.很抱歉格式不好,这是我的第一篇帖子.

谢谢

推荐答案

您可以将四个条件简化为一个条件:

  • 如果下一行是"New",则使用EndTime值,否则为"Null":
df['N_E'] = df['EndTime'].where(df['S/N'].shift(-1).eq('New'), 'Null')

输出:

           StartTime           EndTime  Dura  Diff   S/N               N_E
0   05/01/2024 12:27  05/01/2024 13:04  2224  1036   New  05/01/2024 13:04
1   06/01/2024 07:05  06/01/2024 07:06    60  1081   New              Null
2   06/01/2024 07:06  06/01/2024 07:06     0     0  Same  06/01/2024 07:06
3   08/01/2024 10:26  08/01/2024 10:27    32   200   New  08/01/2024 10:27
4   08/01/2024 11:45  08/01/2024 11:46    38    78   New  08/01/2024 11:46
5   09/01/2024 13:48  09/01/2024 13:51   172   122   New  09/01/2024 13:51
6   09/01/2024 16:41  09/01/2024 16:42    60   170   New              Null
7   09/01/2024 16:43  09/01/2024 17:37  3267     1  Same              Null
8   09/01/2024 17:38  09/01/2024 17:41   189     1  Same  09/01/2024 17:41
9   10/01/2024 10:06  10/01/2024 10:08   142   985   New  10/01/2024 10:08
10  10/01/2024 10:51  10/01/2024 10:53   116    43   New  10/01/2024 10:53
11  10/01/2024 11:00  10/01/2024 11:00    26     7   New  10/01/2024 11:00
12  12/01/2024 12:17  12/01/2024 12:30   752    77   New  12/01/2024 12:30
13  15/01/2024 08:01  15/01/2024 08:01    36  1171   New  15/01/2024 08:01
14  16/01/2024 15:44  16/01/2024 15:53   577   463   New  16/01/2024 15:53
15  16/01/2024 16:43  16/01/2024 17:16  2003    50   New              Null
16  16/01/2024 17:16  16/01/2024 17:17    69     0  Same  16/01/2024 17:17
17  17/01/2024 00:03  17/01/2024 00:04    60   406   New              Null
18  17/01/2024 00:04  17/01/2024 00:20   943     0  Same  17/01/2024 00:20
19  17/01/2024 06:08  17/01/2024 06:09    16   348   New              Null

如果您希望根据条件使用不同的值,则使用numpy.select是一种更通用的方法,但在本例中实际上并不需要该方法:

curr_new  = df['S/N'].eq('New')
curr_same = df['S/N'].eq('Same')

next_row  = df['S/N'].shift(-1)
next_new  = next_row.eq('New')
next_same = next_row.eq('Same')

df['N_E'] = np.select(
          [curr_new&next_new,
           curr_new&next_same,
           curr_same&next_same,
           curr_same&next_new,
          ],
         [df['EndTime'],
          'Null',
          'Null',
          df['EndTime'],
         ], 'undefined')

Python-3.x相关问答推荐

确定字符串的长度并提取前15或14个字符

如何使用PySide6创建切换框架?

根据另一列中的条件填写该列中的值

当条件第一次出现时将行标记为True,如果按顺序重复则标记为False

将两列的乘积连续添加到一列的累积和中

使用 iloc 或 loc 对多列进行过滤

「Python Pandas」多级索引列和行匹配,如果列和行名称相似,则排除这些单元格中的值添加

如何提高 snowpark 程序的性能?

Python 3 `str.__getitem__` 的计算复杂度是多少?

Pytorch:图像标签

二进制文件的 Python 3 和 base64 编码

Python:pprint的模块错误,打印没有错误

如何为 Python 中的线程设置异步事件循环?

Python:遍历子列表

pysftp vs. Paramiko

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

sys.stdin.readline() 读取时没有提示,返回 'nothing in between'

ImportError:无法导入名称cross_validate

Python的max函数有多高效

是否可以在每个路由的基础上限制 Flask POST 数据大小?