在图像文件夹中查找与id关联的所有文件?

2024-05-19 03:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试基于类标签和文件夹中的图像填充数据帧

我有一个文件夹,其中有10000多个图像,名称结构如下:['leaflet_10000_1.jpg', 'leaflet_10000_2.jpg', 'leaflet_10001_1.jpg', 'leaflet_10001_2.jpg', 'leaflet_10002_1.jpg', 'leaflet_10002_2.jpg', 'leaflet_10003_1.jpg', 'leaflet_10003_2.jpg'

以及结构的附带csv文件:

ID,Location,Party,Representative/Candidate,Date
1000,Glasgow North,Liberal Democrats,,02-Apr-10
1001,Erith and Thamesmead,Labour Party,,02-Apr-10

我想创建一个新的csv文件,其中包含所述Party的所有图像的路径。我可以使用以下命令将某一方从完整的csv文件中分离出来:

df_ = df.loc[df["Party"] == "Labour Party"]

这将给我一个我感兴趣的聚会,但是我如何创建一个与之相关的所有图片的完整列表。。从上面共享的图像列表中,可以看到ID 1001有2个与之关联的图像。。这不是一个固定的数字,有些ID有3到5个与之关联的图像

如何使用所有必需的路径填充此新数据帧

我的思考过程是对每个文件名应用str.split(name, '_'),然后根据所有结果搜索每个ID,但从那里开始呢


Tags: 文件csv数据图像路径文件夹iddf
3条回答

你在正确的轨道上

如果所有ID都是唯一的,并且您希望输出数据帧中包含方号和图像号,则可以执行以下操作:

from pathlib import Path
import numpy as np
import pandas as pd

partySer = df.loc[:, ['ID', 'Party']].set_index('ID')
# Get image names
imgFiles = list(Path('./<your-image-path>/').glob('*.jpg'))
imgFiles_str = np.array([str(f) for f in imgFiles])

# Grab just the integer ID from each image name
imgIds = np.array([int(f.stem.split('_')[1]) for f in imgFiles])

# Build dataframe with matching ids
outLst = []
for curId, party in partySer.iterrows():
  matchingImgIdxs = imgIds == curId
  matchingImgs = imgFiles_str[matchingImgIdxs]
  outLst.append({'Party': party, 'images': matchingImgs})

outDf = pd.DataFrame(outLst)

我还没有测试过这段代码,但它应该会引导您走上正确的道路

让我们创建图像的数据帧并提取id

from pathlib import Path

img_df = pd.DataFrame({'img' : [i.stem for i Path(your_images).glob('*.jpg')]})

img_df['ID'] = img_df['imgs'].astype(str).str.split('_',expand=True)[1].astype(int)

img_dfg = img_df.groupby('ID',as_index=False).agg(list)

      ID                                        imgs
0  10000  [leaflet_10000_1.jpg, leaflet_10000_2.jpg]
1  10001  [leaflet_10001_1.jpg, leaflet_10001_2.jpg]
2  10002  [leaflet_10002_1.jpg, leaflet_10002_2.jpg]
3  10003  [leaflet_10003_1.jpg, leaflet_10003_2.jpg]

然后我们只需要合并ID列

df_merged = pd.merge(df,img_dfg,on='ID',how='left')

然后,您可以执行任何进一步的操作来分组或列出图像

您希望数据帧中有什么内容?您在这里说您想用所需的路径填充df?如果是这样,那么使用str.split(name, '_')将允许您获得每个文件的以下信息:其ID和编号

现在,您可以使用这两个特征在数据帧中插入元素,添加从您描述的相对.csv文件中获得的任何其他特征。最后,过滤dataframe以获得与给定条件对应的所有元素,这将为您提供所需的内容

您似乎认为一个ID意味着数据帧中的一行,但这是不正确的,因为在您的情况下,每一行都用一个(ID,数字)来描述,因此,您的函数已经为您提供了与party/ID/其他特征相关联的所有图像的完整列表

如果要减小数据帧的大小,因为与同一ID相关的所有图像只有一个不同的特征,您还可以有一个“文件”列,其中包含与此ID相关的所有图像的列表(因此,请删除“数字”列),或者只包含与它们相关的数字,因为它们的路径由主路径组成,后跟“_number.jpg”。这个解决方案会更有效率

相关问题 更多 >

    热门问题