使用 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你得到的输出,我们将从那里继续
我正在 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你得到的输出,我们将从那里继续