创建一个包含列表值并依赖于另一列的列

Create a column with values of a list and depending on another column

img_dir = [img_pathA.1.jpg, img_pathA.2.jpg, img_pathA.3.jpg, img_pathB.1.jpg, img_pathB.2.jpg, .... img_pathZ.3.jpg]

df:

ID
一个
B
C
..
Z

如您所见,列表中的每个图像路径都在其文件名中包含所属的 ID。

我想为数据框中的每个 ID 添加所有图像路径。目标是得到这样的东西:

final_df:

ID img_path
一个 img_pathA.1.jpg
一个 img_pathA.2.jpg
一个 img_pathA.3.jpg
B img_pathB.1.jpg
B img_pathB.2.jpg
.. .......
Z img_pathZ.3.jpg

每个ID的图像数量不固定(通常每个ID 2-3张图像),所以我想我可以复制整个数据帧大概3次,对每一行进行分配,然后删除没有路径的行(“无路径”)。

我试过以下代码:

df['img_path'] = "No path"
df = pd.concat([df]*3, ignore_index=True)

for ID in df['ID']:
    for path in img_dir:
        if ID in path:
            df.loc[(df['ID'] == ID), 'img_path'] = path

但我得到了这样的东西。我认为这是因为 ID 也被复制了,并且该列似乎存储了每个 ID 的最后一张图像:

ID img_path
一个 img_pathA.3.jpg
一个 img_pathA.3.jpg
一个 img_pathA.3.jpg
B img_pathB.2.jpg
B img_pathB.2.jpg
.. .......
Z img_pathZ.3.jpg

知道如何解决或改进这个问题吗?

提前致谢。

img_dir 列表创建一个系列,然后从相应路径 extract ID 并将提取的 ID 设置为系列的索引,然后 join 该系列在列 ID

上的数据框
s = pd.Series(img_dir)
s.index = s.str.extract(fr"({'|'.join(df['ID'])})", expand=False)

df.join(s.rename('img_path'), on='ID')

  ID          img_path
0  A   img_pathA.1.jpg
0  A   img_pathA.2.jpg
0  A   img_pathA.3.jpg
1  B   img_pathB.1.jpg
1  B   img_pathB.2.jpg
...
3  Z   img_pathZ.3.jpg