0

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

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

4

1 回答 1

0

作为最低限度,您可以减少索引、转换和 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。请注意,此函数返回一个新的过滤列表,您可以删除旧的。

_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 阅读器对象

with open('some.csv') as in_fp:
    my_table = reformat_csv_data(csv.reader(in_fp))
于 2018-05-31T18:02:59.573 回答