使用 pandas 改进嵌套循环

Improve nested loop with pandas

我正在 python 笔记本中使用 pandas 进行一些数据分析。我正在尝试制作一个简单的嵌套循环,但这表现非常糟糕。

问题是我有两个 table,每个包含两列,第一列包含时间戳 (hh:mm:ss),第二列包含一些整数值。

第一个 table (big_table) 包含 86400 行,一天中每个可能的时间戳,每个整数值初始设置为 0。 第二个 table (small_table) 包含较少的行,每个时间戳记录一个实际整数值。 目标是在时间戳相同的行中将 small_table 整数映射到 big_table 整数。我还想在 big_table 时间戳中找不到 small_table 时间戳时写入最后写入的整数。

我这样做是为了“强制”使用 Java/C 方法,它遍历每个元素,将它们作为矩阵的 [i][j] 元素进行访问。

使用 pandas/numpy 有更好的方法吗?

代码:

rel_time_pointer = small_table.INTEGER.iloc[0]

for i in range(small_table.shape[0]):

  for j in range(big_table.shape[0]):

    if (small_table.time.iloc[i] == big_table.time.iloc[j]):
      rel_time_pointer = small_table.INTEGER.iloc[i]
      big_table.INTEGER.iloc[j] = rel_time_pointer
      break

    else:
      big_table.INTEGER.iloc[j] = rel_time_pointer

示例:

big_table:
time        INTEGER
00:00:00    0
00:00:01    0
00:00:02    0
00:00:03    0
00:00:04    0
00:00:05    0
00:00:06    0
    .
    .
    .
23:59:59    0

small_table:
time        INTEGER
00:00:03    100
00:00:05    100

big_table_after_execution:
time        INTEGER
00:00:00    0
00:00:01    0
00:00:02    0
00:00:03    100
00:00:04    100
00:00:05    200
00:00:06    200

使用@gtomer 合并命令:

    big_table = big_table.merge(small_table, on='time', how='left')

并在我得到的命令末尾添加 .fillna(0):

    time    INTEGER__x  INTEGER__y
    00:00:00    0   0.0
    00:00:01    0   0.0
    ...         ... ...

在 big_table_after_execution 的正确位置使用 small_table 的整数值。现在我正在尝试将 0 值设置为非 0 顶部元素:

    time    INTEGER__x  INTEGER__y
    00:00:00    0   0.0
    00:00:01    0   0.0
    00:00:02    0   0.0
    00:00:03    0   1.0
    00:00:04    0   1.0
    00:00:05    0   2.0
    00:00:06    0   2.0

而不是:

    00:00:00    0   0.0
    00:00:01    0   0.0
    00:00:02    0   0.0
    00:00:03    0   1.0
    00:00:04    0   0.0
    00:00:05    0   2.0
    00:00:06    0   0.0

Numpy 迭代和枚举选项:

如果你有一个二维np.ndarray类型的对象,那么迭代可以在一行中实现如下:

for (i,j), value in np.ndenumerate(ndarray_object):... 

这与常规枚举类似,但允许您将更高维度的索引解构为适当维度的元组。

您可以将您的值放入 numpy 的二维数组结构中并像那样遍历它们吗?

修改现有内容以使其看起来更少的最简单方法 'c-like' 可能只是使用常规枚举:

for small_index, small_value in enumerate(small_table):

  for big_index, big_value in enumerate(big_table):...

zip

将迭代组合在一起的另一个选项是 zip() 函数,它将组合可迭代对象 1 和 2,但它只会生成长度等于最小可迭代长度的结果可迭代对象。

请尝试以下操作:

big_table_after_execution = big_table.merge(small_table, on='time', how='left')

请post你得到的输出,我们将从那里继续