Как быстро заменить значения в огромном списке - PullRequest
0 голосов
/ 31 мая 2018

У меня есть объект списка с 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 голосов
/ 31 мая 2018

Как минимум, вы можете уменьшить индексирование, преобразование и операторы 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 хорош для эффективной перестройки списков, и понимание вложенных списков может быть быстрее.Это немного загадочно, но этот код перестраивает внешний список, отфильтровывая пустые строки со вторым пониманием списка, которое преобразует наноподобный текст в 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))
...