我有两个表表1和表2.表1有一列,表2有两列。我在下面给出了我的两个表的一个例子,以进一步解释我想要做什么。
TABLE 1 TABLE 2
A B C
0.015 0.000 14.0 #The BINS are 0.00-0.01 = 14.0
0.033 0.025 14.5 # 0.01-0.02 = 14.5
0.042 0.050 15.0 # 0.02-0.03 = 15.0
0.501 0.075 15.5 # 0.03-0.04 = 15.5 AND SO ON
0.505 0.100 16.0
0.520 0.125 16.5
0.350 0.150 17.0
如果我们在B栏中选择BINS,即0.0到0.01和0.01到0.02等等。
我想选择表1中的A列,取第一个值(0.015)找出它所在的范围(BIN)(我们可以看到它位于0.000和0.025之间),< / strong>我想在表1中添加第二列,并将其值14.5(表2中的第二个BIN)。
我想对表1的第二个值重复相同,即0.033,我们可以看到它介于0.025和0.050之间,所以我们给它值15.5(来自表2)。等等。
问题是,我知道迭代的唯一方法是使用for循环,
for a in A: #takes the values of column A in table 1
但在这里我不知道如何继续前进。的即。如何检查B列的哪个BIN对我的A列值是什么?以便我可以从C列中给它相应的值
答案 0 :(得分:2)
您可以将a
乘以40,然后将其转换为int,并将其用作表2中的索引。
例如,取第一个值(0.015)并将其乘以40(0.6)并将其转换为int(0),然后在表2中得到所需的索引。
D = list()
for a in A:
index = int(a*40)
try:
corresponding_value_from_c = C[index]
except IndexError:
corresponding_value_from_c = C[-1]
D.append(correspondin_value_from_c)
最后,D将是包含您需要的所有值的列。
答案 1 :(得分:2)
您可以使用for i, x in enumerate(X)
遍历列表。这为您提供了列表的元素和该元素的索引。您也可以使用for i in range(len(X))
,因为在您的情况下,您可能需要进行预测。也许这适用于具有任意箱尺寸的解决方案:
A2 = []
for a in A:
for i in range(len(B)-1):
if a < B[i+1]:
A2.append(C[i])
break
else: # We never broke out
A2.append(C[-1])
我们将A
中的每个元素与B
中逐渐增大的元素进行比较。如果元素a
小于B
中列表元素的值,则它属于上一个bin(即来自0.015
的{{1}}小于{{1}在A
中,因此属于上一个bin)。细分,因为你问:
0.025
我们不是直接在B
上进行迭代,而是循环遍历可能的索引(从A2 = [] # Make a new list
for a in A: # Do the below once for every element in A
for i in range(len(B)-1):
开始到B
结束)。 然而,我们实际上比这更少。如果您使用0
,则最终会得到len(B)-1
。因此,如果您想迭代所有range(10)
,则可以使用0...9
。但我们实际上想要比B
的全长更少,因为在下一步中,我们展望未来。
range(len(B))
此处我们正在查看一个列表索引,以查看B
是否小于索引 if a < B[i+1]:
处的a
元素。如果是,那么我们希望找到与{em>之前的索引对应的B
元素,即索引i+1
。例如,从列表C
中给出i
,我们会从0.015
查看A
。 0.025
,这意味着B
属于上一个bin。这就是我们展望未来的原因。
0.015 < 0.025
抓住与0.015
对应的 A2.append(C[i])
break
元素(不再向前看,因为我们知道C
是正确的bin,因为i
太大了)把它扔进i
。然后i+1
退出内部A2
循环,然后使用break
的下一个元素重新开始。
for
如果我们从A
循环中 else: # We never broke out
A2.append(C[-1])
else
,那么break
语句就会执行。在这种情况下,for
只能位于最后的bin中,因此我们只需从a
中获取位于列表末尾的元素(C
将自动执行)。< / p>