在迭代数据帧

时间:2018-06-05 07:01:25

标签: python pandas csv

我有一个包含许多图像的目录(* .jpg)。每个图像都有一个名称。在同一目录中,我有一个包含python代码的文件(如下)。

import numpy as np
import pandas as pd
import glob

fd = open('melanoma.csv', 'a')
for img in glob.glob('*.jpg'):
    dataFrame = pd.read_csv('allcsv.csv')
    name = dataFrame['name']
    for i in name:
        #print(i)
        if(i+'.jpg' == img):
            print(i) 

在同一目录中,我有另一个文件(allcsv.csv),其中包含目录中所有图像的大量csv数据以及许多其他图像。上面的代码将图像的名称与allcsv.csv文件中的name列进行比较,并打印出名称。我需要修改此代码,将比较图像的一行中的所有数据写入名为“melanoma.csv”的文件中。

例如:

allcsv.csv

name,age,sex    
ISIC_001,85,female    
ISIC_002,40,female    
ISIC_003,30,male    
ISIC_004,70,female     

如果文件夹仅包含ISIC_002和ISIC_003的图像

melanoma.csv

name,age,sex    
ISIC_002,40,female    
ISIC_003,30,male

2 个答案:

答案 0 :(得分:0)

首先,您的代码会为每个图像读取一次.csv文件。其次,你有一个嵌套的for - 循环。两者都不理想。我建议采用以下方法:

步骤1 - 创建图像文件名列表

import glob

image_names = [f.replace('.jpg', '') for f in glob.glob("*.jpg")]

第2步 - 使用患者姓名创建数据框

import pandas

df_patients = pd.read_csv('allcsv.csv')

第3步 - 过滤健康患者并转入csv

df_sick = df_patients[df_patients['name'].isin(image_names)] 
df_sick.to_csv('melanoma.csv', index = False)

第4步 - 打印病人姓名

for rows in df_sick.iterrows():
    print row.name, 'has cancer'

答案 1 :(得分:0)

这只是将匹配值存储到新文件melanoma.csv的解决方案。

您的代码可以进一步改进和优化。

import numpy as np
import pandas as pd
import glob

# Create a dictionary object
d={}

for img in glob.glob('*.jpg'):
    dataFrame = pd.read_csv('allcsv.csv')
    name = dataFrame['name']
    for i in name:
        #print(i)
        if(i+'.jpg' == img):
            # update dictionary d everytime a match is found with all the required values
            d['name'] = i
            d['age']= dataFrame['age']
            d['sex'] = dataFrame['sex']

# convert dictionary d to dataframe
df = pd.DataFrame(d, columns=d.keys())
#Save dataframe to csv
df.to_csv('--file path--/melanoma.csv')