Python: эффективный способ создания нового CSV из большого набора данных - PullRequest
0 голосов
/ 18 октября 2018

У меня есть скрипт, который удаляет «плохие элементы» из основного списка элементов, а затем возвращает CSV с обновленными элементами и их связанными значениями.

Мой вопрос, есть ли более эффективный способ выполнить ту же операцию в цикле for?

Master=pd.read_csv('some.csv', sep=',',header=0,error_bad_lines=False)

MasterList = Master['Elem'].tolist()
MasterListStrain1 = Master['Max_Principal_Strain'].tolist()

#this file should contain elements that are slated for deletion
BadElem=pd.read_csv('delete_me_elements_column.csv', sep=',',header=None, error_bad_lines=False)
BadElemList = BadElem[0].tolist() 

NewMasterList = (list(set(MasterList) - set(BadElemList)))

filename = 'NewOutput.csv'
outfile = open(filename,'w')

#pdb.set_trace()


for i,j in enumerate(NewMasterList):
    #pdb.set_trace()
    Elem_Loc = MasterList.index(j)
    line ='\n%s,%.25f'%(j,MasterListStrain1[Elem_Loc])
    outfile.write(line)  


print ("\n The new output file will be named: " + filename)


outfile.close()

1 Ответ

0 голосов
/ 18 октября 2018

Этап 1

Если вы обязательно хотите выполнить итерацию в цикле for, кроме использования pd.to_csv, который может улучшить производительность, вы можете сделать следующее:

...
SetBadElem = set(BadElemList)
...
for i,Elem_Loc in enumerate(MasterList):
    if Elem_Loc not in SetBadElem:
        line ='\n%s,%.25f'%(j,MasterListStrain1[Elem_Loc])
        outfile.write(line)  

Переход по индексу никогда не эффективен, тогда как итерация с пропуском даст вам гораздо лучшую производительность (проверка наличия в наборе - это log n операция, поэтому она относительно быстрая).

Этап 2 Правильное использование Pandas

...
SetBadElem = set(BadElemList)
...
for Elem in Master:
    if Elem not in SetBadElem:
        line ='\n%s,%.25f'%(Elem['elem'], Elem['Max_Principal_Strain'])
        outfile.write(line)  

Нет необходимости создавать списки из столбцов панд данных.Использование всего фрейма данных (и индексация в нем) - гораздо лучший подход.

Этап 3 Удаление беспорядочных итеративных операций форматирования

Мы можем добавить столбец («Отформатированный»)) который будет содержать отформатированные данные.Для этого мы создадим лямбда-функцию :

formatter = lambda row: '\n%s,%.25f'%(row['elem'], row['Max_Principal_Strain'])

Master['Formatted'] = Master.apply(formatter)

Этап 4 Панда-способ фильтрации и вывода

Мы можем отформатировать кадр данных вдва пути.Я предпочитаю повторно использовать функцию форматирования:

import numpy as np
formatter = lambda row: '\n%s,%.25f'%(row['elem'], row['Max_Principal_Strain']) if row not in SetBadElem else np.nan

Теперь мы можем использовать встроенный dropna, который удаляет все строки, имеющие любые значения NaN

Master.dropna()  
Master.to_csv(filename)
...