我有一个列表对象,里面有大约600000个列表。
我需要进行一些数据处理和转换,以替换大列表对象中的某些列表值。
我使用以下函数替换值:
# Clean empty strings/rows
def reformat_csv_data(csv_content):
for csv_content_row_idx, csv_content_row in reversed(list(enumerate(csv_content))):
if csv_content_row: # Check if the list is empty
for csv_content_column_idx, csv_content_column in enumerate(csv_content_row):
if str(csv_content[csv_content_row_idx][csv_content_column_idx]).lower() == 'nan' or \
str(csv_content[csv_content_row_idx][csv_content_column_idx]).lower() == 'n/a' or \
str(csv_content[csv_content_row_idx][csv_content_column_idx]).lower() == 'na' or \
str(csv_content[csv_content_row_idx][csv_content_column_idx]).lower() == 'null' or \
str(csv_content[csv_content_row_idx][csv_content_column_idx]) == '':
csv_content[csv_content_row_idx][csv_content_column_idx] = None
else:
del csv_content[csv_content_row_idx] # Delete list if empty
return csv_content
我遇到的问题是处理大量数据时速度太慢。我知道这可以更有效地完成,但我是初学者,不知道如何。请你帮助我好吗?感谢
答案 0 :(得分:0)
至少可以将索引,转换和if语句减少到
match (:Person)-[r :ACTED_IN]->(:Movie)
return r.roles
但是python擅长有效地重建列表,嵌套列表理解可能更快。它有点神秘,但是这段代码重建了外部列表,过滤掉了空行,第二个列表理解将类似nan的文本转换为None。请注意,此函数返回一个新的筛选列表,您可以删除旧的。
val = str(csv_content[csv_content_row_idx][csv_content_column_idx]).lower()
if val in {'nan', 'n/a', 'na', 'null', ''}:
csv_content[csv_content_row_idx][csv_content_column_idx] = None
在您阅读数据时,最好还是进行此过滤。由于此代码仅迭代原始列表列表,因此可能需要使用迭代器。例如,CSV阅读器对象
_none_synonyms = {'nan', 'n/a', 'na', 'null', ''}
def reformat_csv_data(csv_content):
return [ [ cell
if not isinstance(cell, str) or cell.lower() not in _none_synonyms
else None
for cell in row ]
for row in csv_content if row ]