如何快速替换巨大列表中的值
How to quickly replace values in a huge list
我有一个列表对象,里面有大约 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
我遇到的问题是处理大量数据时速度太慢。我知道这可以更有效地完成,但我是初学者,不知道怎么做。请你帮助我好吗?谢谢
您至少可以将索引、转换和 if 语句减少到
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
但是 python 擅长有效地重建列表,嵌套列表理解可能更快。它有点神秘,但这段代码重建了外部列表,通过第二个列表理解过滤掉空行,将类似 nan 的文本转换为 None。请注意,此函数 returns 一个新的过滤列表,您可以删除旧的。
_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 ]
在您读取数据时进行此过滤可能会更好。由于此代码仅迭代原始列表列表,因此它可以采用迭代器代替。例如,CSV reader 对象
with open('some.csv') as in_fp:
my_table = reformat_csv_data(csv.reader(in_fp))
我有一个列表对象,里面有大约 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
我遇到的问题是处理大量数据时速度太慢。我知道这可以更有效地完成,但我是初学者,不知道怎么做。请你帮助我好吗?谢谢
您至少可以将索引、转换和 if 语句减少到
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
但是 python 擅长有效地重建列表,嵌套列表理解可能更快。它有点神秘,但这段代码重建了外部列表,通过第二个列表理解过滤掉空行,将类似 nan 的文本转换为 None。请注意,此函数 returns 一个新的过滤列表,您可以删除旧的。
_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 ]
在您读取数据时进行此过滤可能会更好。由于此代码仅迭代原始列表列表,因此它可以采用迭代器代替。例如,CSV reader 对象
with open('some.csv') as in_fp:
my_table = reformat_csv_data(csv.reader(in_fp))