我有以下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的循环效率非常低,我想知道是否还有另一种方法(智能方法)来实现这一目标。
谢谢, 迭戈
答案 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