在循环中检索索引时出现问题

Posted

技术标签:

【中文标题】在循环中检索索引时出现问题【英文标题】:Problem while retrieving indices in a loop 【发布时间】:2021-12-05 06:53:19 【问题描述】:

我正在尝试运行一个循环来从 A 列中每个元素的一组固定值 [125 150 175 200] 中找到一个 excel 列(比如说 A 列)之间的差异。当我找到差异时,然后我想找到差异的最小值,并且需要找到这些值的索引。

代码在这里:

Ref = pd.ExcelFile ('Current parametric sweep_reference.xlsx')

print(Ref.sheet_names) 
for Sheet in Ref.sheet_names: 

Ref = pd.read_excel("Current parametric sweep_reference.xlsx",sheet_name=Sheet)
tempdiff = [125, 150, 175, 200] 
numbdiff = len(tempdiff)
values = np.zeros(numbdiff)
Tchipavg=list(Ref["Temperature (degC), Tchipcenter"])
Time =list(Ref["Time (s) (s)"])

index = list(Tchipavg).index(np.max(Tchipavg))
Time = Time[:index]

for j in range(0,numbdiff):

        diff =np.array([x-tempdiff[j] for x in Tchipavg[:index-1]])
        values[j] = min(abs(diff))
        min_index, min_value = min(enumerate(diff), key = operator.itemgetter(1))
        print(min_index, min_value)

print(values)

当我打印值时,它确实给出了差异的最小值,但我正在努力寻找我必须用来在另一列中查找值的索引,比如说 B 列。 你能指出这里的错误是什么吗?

数据示例:

df = pd.DataFrame([[0, 95.68 ], [1, 137.04], [2, 149.41], [3 , 158.25 ], [4, 165.28 ], [5 , 127.31 ], [6, 119.80 ], columns=['Time', 'Temp'])

输出应该给出每个 delta T (tempdiff) 情况下最小差异的索引,例如,在@Jezrael 的回答中,数组中有 4 个值用于 4 tempdiff [125、150、175、200]。输出给出了这 4 个中的最小值。相反,我只需要找到相同 tempdiff 的所有数组的最小值。例如,它会是这样的:

values = [2.31  0.59 9.72 34.72]
indices = [5    2    4    4]

【问题讨论】:

超级,样本数据的预期输出如何? 我添加了一些值 【参考方案1】:

在 pandas 中最好避免循环,如有必要,因此创建了矢量化解决方案。


如果需要用绝对值将list 减去DataFrame 中的所有值并获取索引,请使用numpy - 将值转换为数组,用broadcasting 减去,获取绝对值并最后通过numpy.argmin 获取索引:

Ref = pd.DataFrame([[0, 95.68 ], [1, 137.04], [2, 149.41], [3 , 158.25 ],
                   [4, 165.28 ], [5 , 127.31 ], [6, 119.80 ]], columns=['Time', 'Temp'])

tempdiff = [125, 150, 175, 200] 

arr = Ref["Temp"].to_numpy()
a = np.abs(arr[:, None] - np.array(tempdiff))
print (a)

[[ 29.32  54.32  79.32 104.32]
 [ 12.04  12.96  37.96  62.96]
 [ 24.41   0.59  25.59  50.59]
 [ 33.25   8.25  16.75  41.75]
 [ 40.28  15.28   9.72  34.72]
 [  2.31  22.69  47.69  72.69]
 [  5.2   30.2   55.2   80.2 ]]

idx = np.argmin(a, axis=0)
print (idx)
[5 2 4 4]

values = a[idx, range(a.shape[1])]
print (values)
[ 2.31  0.59  9.72 34.72]

【讨论】:

在使用广播进行减法时,我收到此错误“操作数无法与形状 (80,) (4,) 一起广播”,其中一个数组中有 80 个值,临时差异中有 4 个 @UQ07 - 数组在列中吗?不像样本数据? 在列中是的,但在这里我不想获得所有临时差异值的最小值,但在假设 125 的相同 tempdiff 内,我需要所有数组中的最小值,然后也需要其他 tempdiff @UQ07 - 你能用预期的输出改变数据样本吗? 我该怎么做?对不起Python初学者

以上是关于在循环中检索索引时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

从嵌入式 RavenDB 中的索引检索结果时出现问题

尝试从一系列字典中检索键时出现“类型错误:列表索引必须是整数或切片,而不是 str”

在python中使用for循环时出现JSONDecodeError [重复]

从数组中删除重复项时出现超出范围异常

在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时

为啥在 Vue js 中尝试从 firebase 检索令牌时出现错误?