我正在尝试遍历目录中的.jpg文件,以匹配.csv文件的单个列(image_name)中的名称。
import csv
import pandas as pd
import fnmatch
import os
imagenames=pd.read_csv('file.csv',header=0,usecols=['image_name'])
imnum=imagenames.shape[0]
for filename in os.listdir("directory"):
for i in range(imnum):
if imagenames.iloc[i] == filename:
print(imagenames.iloc[i])
我收到一条错误消息:ValueError:Series的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 任何人都可以帮我解释代码吗?
答案 0 :(得分:1)
虽然您没有包含行号,但我认为错误在行imagenames.iloc[i] == filename
上。您收到此错误是因为imagenames.iloc[i]
会导致Pandas系列对象(代表单个列)。
你可以通过替换为imagenames.iloc[i]['image_name']
解决此问题,但结果代码将有2个循环并且正在做大量的额外工作。
相反,我建议重构以下目标:
有几种方法可以做到这一点,你不会提到这些列表有多大。让我们假设它们相对较小,一种接近代码的方法,这种方式更符合Pandas对数据的矢量化方法:
imagenames=pd.read_csv('file.csv',header=0,usecols=['image_name'])
files_in_dir = os.listdir("directory")
matches = imagenames[imagenames['image_name'].isin(files_in_dir)]
这不是超级高效,因为.isin
正在搜索文件列表,如果列表很长,则可能会很慢。如果情况属于这种情况,您可以考虑使用集合或其他优化。
答案 1 :(得分:1)
我这样做:
{{1}}