尝试使用pandas匹配目录中的文件名和python中.csv文件中的元素

时间:2017-08-22 16:42:48

标签: python-3.x pandas

我正在尝试遍历目录中的.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()。 任何人都可以帮我解释代码吗?

2 个答案:

答案 0 :(得分:1)

虽然您没有包含行号,但我认为错误在行imagenames.iloc[i] == filename上。您收到此错误是因为imagenames.iloc[i]会导致Pandas系列对象(代表单个列)。

可以通过替换为imagenames.iloc[i]['image_name']解决此问题,但结果代码将有2个循环并且正在做大量的额外工作。

相反,我建议重构以下目标:

  • 您有CSV中的文件名列表
  • 您有目录列表中的文件名列表
  • 您想要这两个列表的交集(即同时出现在两者中的文件名)

有几种方法可以做到这一点,你不会提到这些列表有多大。让我们假设它们相对较小,一种接近代码的方法,这种方式更符合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}}