Этап 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)