创建一个包含列表值并依赖于另一列的列
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]
- 还有一个带有
ID
列的数据框:
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
- 我有一个不同图片的路径列表:
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]
- 还有一个带有
ID
列的数据框:
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