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.4 和 Python 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 行,因此我的循环在失败之前甚至从未达到有效值。
背景
我正在使用 Pandas 1.3.4 和 Python 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 行,因此我的循环在失败之前甚至从未达到有效值。