如何快速替换巨大列表中的值

时间:2018-05-31 17:29:38

标签: python-2.7 csv reformatting

我有一个列表对象,里面有大约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

我遇到的问题是处理大量数据时速度太慢。我知道这可以更有效地完成,但我是初学者,不知道如何。请你帮助我好吗?感谢

1 个答案:

答案 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 ]