我有一个Pandas DataFrame df
,它有一个path
列,其中包含用于分析的图像文件的路径。该数据集中的某些图像实际上并不存在,因此我需要有选择地删除图像不存在的行path
。
目前,我正在遍历整个数据框,并像这样重新分配它:
for index, sample in df.iterrows():
if not os.path.isfile(sample['path']):
df = df.drop(index)
但是,由于我的数据集包含成千上万张图像,所以这非常慢。
我还考虑过使用类似这种更普遍的问题here的方法:
df = df.drop(df[not os.path.isfile(df['path'])].index)
但是,此操作不起作用,因为os.path.isfile
与Pandas DataFrame不兼容。
我觉得必须有更好的方法来解决此问题。有什么想法吗?
答案 0 :(得分:1)
尝试在行(axis = 1)上使用.apply
以获得符合条件的布尔索引:
df = df.drop(df.apply(lambda row: not os.path.isfile(row['path']), axis=1))
答案 1 :(得分:1)
我会为列表理解而不是apply()
投票以提高性能,并使用输出作为布尔索引进行切片:
df[[os.path.isfile(i) for i in df['path']]]