Python 将打印列表值,但在尝试访问值时表示列表为空(使用 .pop() 或索引 [0] 等)

Python will print list value but says list is empty when trying to access values (using .pop() or indexing[0] etc.)

背景

我正在使用 Pandas 1.3.4Python 3.9.6[= 从 .xlsx 电子表格中读取数据62=].

我想要基于 'Code' 列中的 code 的每个项目的数据,因此我首先使用以下方法在数据框 (df) 中隔离一行:

row = df.loc[df['Code'] == code]

为了在行中获取单个值,我使用索引和它们的 headers 访问它们,如下所示:

barcode = row['Barcode'].values.tolist()

我正在使用 .values,否则我会得到繁琐的行号和数据类型输出。我正在使用 .tolist() 以便我可以有效地访问实际条形码而不是科学记数法解释。请注意,这意味着 barcode 应该是具有单个值的列表。

问题

这是我的问题,当我打印 barcode 时,我得到了一个合理的输出,例如:[72934728491] (注意这不是实际的条形码,而是一个 11 位数字的示例)

更新: len(barcode) returns 1 和 type(barcode) returns <class 'numpy.ndarray'><class 'list'>如果我用过 .tolist()

但是,如果我尝试使用 barcode[0]barcode.pop() 访问列表中的值,我会收到错误消息,指出索引超出范围或无法使用 .pop()在空列表上。

奇怪的是,如果我编写一个 for 循环来从列表中获取值,它就可以正常工作:

for item in barcode:
    print(item)

问题

请有人解释为什么会发生这种情况以及如何实际修复它(而不是必须为我需要在行上访问的每个列值编写一个 for 循环)。

更新(根据要求提供更多代码)

我试图构建一个最小可行示例来提供帮助,但目前我正在努力在其他代码中复制该问题,这是我剖析数据框的部分,不幸的是我无法显示我读入的部分df 因为它包含私人信息,但电子表格读入 df 'normally':

for code in new_items:
    row = df.loc[df['Code'] == code] # row for a single item code
    product_display_name = row['Product Display Name'].values
    product_type = row['Product Type'].values
    description = row['Description'].values
    artist = row['Artist'].values
    barcode = row['Barcode'].values.tolist()
    finish = row['Finish'].values
    unit = row['Unit'].values
    country_of_origin = row['Country of Origin'].values
    job_number = row['Job No.'].values
    samples_date = row['Samples Date'].values

print(barcode.pop()) # this does not work
for item in barcode:
    print(item) # this does work

问题原来与 pandas' 处理空单元格 NaN 值有关。

虽然数据帧显示 NaN,但在 .values.tolist() 转换的某处,我丢失了该信息并且数组为空。一些奇怪的电子表格格式使这变得更加复杂,这意味着数据框具有所有 NaN 值的第 0 行,因此我的循环在失败之前甚至从未达到有效值。