【问题标题】:Finding all files associated with an id within a folder of images?在图像文件夹中查找与 id 关联的所有文件?
【发布时间】:2020-11-27 20:51:04
【问题描述】:

我正在尝试根据文件夹中的类标签和图像填充数据框。

我有一个包含 10,000 多张图像的文件夹,其名称结构如下:['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,但是从那里去哪里?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    你在正确的轨道上!

    如果所有 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)
    

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

    【讨论】:

      【解决方案2】:

      让我们为您的图像创建一个数据框并提取 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')
      

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

      【讨论】:

      • 谢谢,合并后的输出完全符合我的要求。但是是否可以将图像名称或路径与关联方一起输出在自己的行中,而不是列中的列表?
      【解决方案3】:

      你想在你的 DataFrame 中做什么?你在这里说你想用所需的路径填充你的 df ?如果是这样,那么使用 str.split(name, '_') 将允许您获取每个文件的以下信息:其 ID 和编号。

      您现在可以使用这两个特征在数据框中插入元素,添加从您描述的相关 .csv 文件获得的任何其他特征。最后,过滤数据框以获取与给定条件相对应的所有元素应该可以满足您的需求。

      您似乎认为一个 ID 将意味着数据框中的一行,但它不正确,因为在您的情况下,每一行都由 (ID, number) 描述,因此,您的函数已经为您提供了完整的列表与派对/ID/其他特征相关的所有图像。

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

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 2012-08-05
        • 1970-01-01
        • 2014-07-13
        • 2023-03-03
        • 1970-01-01
        • 2021-05-29
        • 1970-01-01
        • 2010-10-18
        相关资源
        最近更新 更多