基于list的csv中的新列,python

时间:2018-04-20 13:50:46

标签: python linux list csv

我有一个csv文件(VV_AL_3T3_P3.csv),每个csv文件的每一行都对应浮游生物的tiff图像。它看起来像这样:

Particle_ID  Diameter  Image_File                   Lenght ....etc
          1     15.36  VV_AL_3T3_P3_R3_000001.tif    18.09
          2     17.39  VV_AL_3T3_P3_R3_000001.tif    19.86
          3     17.21  VV_AL_3T3_P3_R3_000001.tif    21.77
          4      9.42  VV_AL_3T3_P3_R3_000001.tif     9.83

图像一起位于文件夹中,然后按文件夹中的形状分类。 tiff图像的名称由Image_file + Particle ID组成;例如,第一行:VV_AL_3T3_P3_R3_000001_1.tiff

现在,我想在csv文件中添加一个名为“Class”的新列(VV_AL_3T3_P3.csv),其中包含每个.tiff文件所在文件夹的名称(该类),使用python;像这样:

Particle_ID  Diameter  Image_File                   Lenght   Class
          1     15.36  VV_AL_3T3_P3_R3_000001.tif    18.09   Spherical
          2     17.39  VV_AL_3T3_P3_R3_000001.tif    19.86   Elongated
          3     17.21  VV_AL_3T3_P3_R3_000001.tif    21.77   Pennates
          4      9.42  VV_AL_3T3_P3_R3_000001.tif     9.83   Others

到目前为止,我有一个列表,其中包含每个tiff文件所在文件夹的名称。这是将成为新列的列表。但是,如何将每个文件夹与其行匹配?换句话说,将“Class”与“Particle ID”和“Image file”匹配。

目前:

## Load modules:
import os
import pandas as pd
import numpy as np
import cv2

## Function to recursively list files in dir by extension
def file_match(path,extension):
    cfiles = []
    for root, dirs, files in os.walk('./'):
        for file in files:
            if file.endswith(extension):
                cfiles.append(os.path.join(root, file))
    return cfiles


## Load all image file at all folders:
image_files = file_match(path='./',extension='.tiff')

## List of directories where each image was found:
img_dir = [os.path.dirname(one_img)[2:] for one_img in image_files]
len(img_dir)

## List of images:
# Image file column in csv files:
img_file = [os.path.basename(one_img)[:22] for one_img in image_files]
len(img_file)
# Particle id column in csv files:
part_id  = [os.path.basename(one_img)[23:][:-5] for one_img in image_files]
len(part_id)

## I have the information related with the collage picture, particle id and the classification folder.
# Now i need to create a loop where this information is merged...

## Load csv file:
data = pd.read_csv('VV_AL_3T3.csv')
sample_file = data['Image File']  # Column name
sample_id   = data['Particle ID'] # Particle ID

我在这里看到了类似的案例:Create new column in dataframe with match values from other dataframe

但我真的不知道如何使用'map.set_index',而且他有两个数据框,而我只有一个。

3 个答案:

答案 0 :(得分:0)

对于问题的第一部分,请使用os.path.split

如果您的路径是... / home / usuario / Desktop / Classification / Fraction_9to20um / Classes / test

os.path.split(path)[1]

将返回测试。

然后在你的for循环中,将其追加到每一行

for row in rows:
    row = row.append(os.path.split(path)[1]
    writer.writerow(row)

参考:https://docs.python.org/3/library/os.path.html

答案 1 :(得分:0)

您可以使用os.path.split(path)将路径分成两部分:开头和最后一部分,无论是文件还是目录。

例如:

myPath = '/test/second/third/theFile.txt'
firstPair = os.path.split(myPath)
# firstPair == ('/test/second/third', 'theFile.txt')

如果您有完整的文件路径并想要最后一个目录名,请运行此命令两次:

filePath = '/home/usuario/Desktop/Classification/Fraction_9to20um/Classes/ClassA/img_001.tiff'
firstPair = os.path.split(filePath)
secondPair = os.path.split(firstPair[0])
print(secondPair[1])
# ClassA

答案 2 :(得分:0)

听起来my_files是(paths + tiff_file_name)的列表。你想要的是父目录的绝对路径的最后一段,似乎。

因此,/some/path/to/directory/classA/instance.tiff将被赋予classA

有两种方法,两种解释略有不同

1)路径的倒数第二部分是类。

rows = [file.split(os.path.sep)[-2] for file in my_files]

2)相对于Classes目录的文件的包含目录是类。

rows = [ os.path.relpath( os.path.dirname(file), '/home/usuario/Desktop/Classification/Fraction_9to20um/Classes/' ) for file in my_files ]

编辑(澄清/样本):为了用它们的文件写出类,

with open(output_path, "w") as f:
    writer = csv.writer(f)
    # optionally, write the header
    writer.writerow(['full_img_path', 'img_class'])
    for file in my_files:
        img_class = os.path.relpath(
            os.path.dirname(file),
            '/home/usuario/Desktop/Classification/Fraction_9to20um/Classes/'
        )
        writer.writerow([file, img_class])

如果您希望output_path成为class.csv或VV_AL_3T3_P3.csv,那么您的问题就不清楚了,但希望您看到它可以轻松互换。

请注意,如果输入和输出之间存在一对一的对应关系(输入 - >简单转换 - >输出),则上述模式往往很容易实现/调试。但是一旦你开始聚合数据(比如每个类的平均文件数),你可能想要开始探索像pandas这样的数据操作库。