从CSV行创建自定义对象

时间:2019-11-16 00:30:39

标签: python pandas dataframe object cycle

我有以下CSV文件:

id;area;zz;nc
1;35.66;2490.8;1
2;65.35;2414.93;1
3;79.05;2269.33;1
4;24.5;2807.68;1
5;19.31;2528.59;1
6;25.51;2596.44;1

其中每一行代表一个具有其ID,区域,zz,cc的所谓的Cell对象。

因此,我创建了以下类:

class cells():
    #    
    # Initializer / Instance Attributes
    def __init__(self, idm, area,zz,nc):
        self.idm  = idm
        self.area = area

想法是创建多个对象作为单元格的数目,并根据文件中的数据为其分配属性。

我首先想到的是将csv文件作为DataFrame读取,并在循环中要填充的对象列表之后。

据我所知,python的循环效率非常低,我想知道是否还有另一种方法(智能方法)来实现这一目标。

谢谢, 迭戈

4 个答案:

答案 0 :(得分:2)

我不太了解循环的含义,但这会为您拥有的每一行创建一个单元格对象列表-给定数据的格式。

对系列的熊猫名单理解是一种合理的选择,请参见https://stackoverflow.com/a/55557758/7582537

尝试一下:

import pandas as pd 


class Cell():
    # Initializer / Instance Attributes
    def __init__(self, idm, area, zz, nc):
        self.idm  = idm
        self.area = area


def create_cells(row):
    newcell = Cell(row[0], row[1], row[2], row[3])
    return newcell


file = pd.read_table("your_file.csv", sep=';')
zipp = zip(file['id'], file['area'], file['zz'], file['nc'])
cells = [create_cells(row) for row in zipp]

print(cells)

答案 1 :(得分:1)

uMdRupert在他的回答中分享了一个有趣的帖子的链接,我建议您检查一下!


我喜欢他使用列表理解的想法,所以我想分享一种类似的方法:

import pandas as pd


class Cell:
    def __init__(self, idm, area, zz, nc):
        self.idm = idm
        self.area = area


cell_df = pd.read_csv('../resources/test_cell_data.csv', delimiter=';')
cell_df = cell_df.rename({'id': 'idm'}, axis='columns')

cell_objs_lst = [Cell(*curr_tuple._asdict()) for curr_tuple in cell_df.itertuples(index=False)]

熊猫可能无法胜任这项任务,因此这是一个使用csv模块的简单方法:

import csv


class Cell:
    def __init__(self, idm, area, zz, nc):
        self.idm = idm
        self.area = area


with open('../resources/test_cell_data.csv', newline='') as in_file:
    next(in_file)
    reader = csv.DictReader(in_file, fieldnames=['idm', 'area', 'zz', 'nc'], delimiter=';')
    cells_lst = [Cell(**curr_row) for curr_row in reader]

答案 2 :(得分:1)

在这种情况下,我认为您不需要熊猫。如果您只需要读取一个csv文件,pandas就算过头了。

直接阅读:

objects = []
next(f) # skip header row
with open('your_file', 'r') as f:
    for row in f:
        objects.append(cells(*row.strip().split(';')))

或使用csv模块。

答案 3 :(得分:0)

我不知道您为Name的每一行使用对象Cells的目的。但是,我认为您可以使用df实现此目标,并将每个对象保持在一个序列中

df.agg

之后,您可以通过索引class Cells(): # Initializer / Instance Attributes def __init__(self, idm, area, zz, nc): self.idm = idm self.area = area self.zz = zz self.nc = nc s = df.agg(lambda x: Cells(*x), axis=1) print(s) Output: 0 <__main__.Cells object at 0x09FA38D0> 1 <__main__.Cells object at 0x09FA3510> 2 <__main__.Cells object at 0x09FA3870> 3 <__main__.Cells object at 0x09FA3AF0> 4 <__main__.Cells object at 0x09B27790> 5 <__main__.Cells object at 0x09B27770> dtype: object 来访问每个对象

s