Итак, я пытаюсь открыть файл CSV, прочитать его поля и на основании этого исправить некоторые другие поля, а затем сохранить эти данные обратно в CSV.Моя проблема в том, что файл CSV имеет 2 миллиона строк.Что было бы лучшим способом ускорить это.
CSV-файл состоит из
ID; DATE(d/m/y); SPECIAL_ID; DAY; MONTH; YEAR
. Я рассчитываю, как часто в моей записи появляется строка с одной и той же датой, а затем обновляет SPECIAL_ID, основываясь на этом.данные.
Основываясь на своих предыдущих исследованиях, я решил использовать панд.В будущем я буду обрабатывать еще большие наборы данных (1-2 ГБ) - этот объем составляет около 119 МБ, поэтому очень важно найти быстрое решение.
Мой код выглядит следующим образом:
df = pd.read_csv(filename, delimiter=';')
df_fixed= pd.DataFrame(columns=stolpci) #when I process the row in df I append it do df_fixed
d = 31
m = 12
y = 100
s = (y,m,d)
list_dates= np.zeros(s) #3 dimensional array.
for index, row in df.iterrows():
# PROCESSING LOGIC GOES HERE
# IT CONSISTS OF FEW IF STATEMENTS
list_dates[row.DAY][row.MONTH][row.YEAR] += 1
row['special_id'] = list_dates[row.DAY][row.MONTH][row.YEAR]
df_fixed = df_fixed.append(row.to_frame().T)
df_fixed .to_csv(filename_fixed, sep=';', encoding='utf-8')
Я пытался сделать печать для каждой тысячи обработанных строк.Сначала моему сценарию нужно 3 секунды на 1000 строк, но чем дольше он работает, тем медленнее он становится.в строке 43000 требуется 29 секунд и т. д. ...
Спасибо за всю будущую помощь:)
РЕДАКТИРОВАТЬ: я добавляю дополнительную информацию о моем CSV и незащищенный вывод
ID;SPECIAL_ID;sex;age;zone;key;day;month;year
2;13012016505__-;F;1;1001001;1001001_F_1;13;1;2016
3;25122013505__-;F;4;1001001;1001001_F_4;25;12;2013
4;24022012505__-;F;5;1001001;1001001_F_5;24;2;2012
5;09032012505__-;F;5;1001001;1001001_F_5;9;3;2012
6;21082011505__-;F;6;1001001;1001001_F_6;21;8;2011
7;16082011505__-;F;6;1001001;1001001_F_6;16;8;2011
8;21102011505__-;F;6;1001001;1001001_F_6;16;8;2011
Я должен заменить - в поле специального идентификатора на соответствующий номер.Например, для строки с ID = 2 SPECIAL_ID будет 26022018505001 ( - заменен на 001), если кто-то еще в CSV будет использовать тот же день, месяц, год, __- будет заменен на 002 и так далее... Таким образом, ожидаемый вывод для вышеуказанных строк будет
ID;SPECIAL_ID;sex;age;zone;key;day;month;year
2;13012016505001;F;1;1001001;1001001_F_1;13;1;2016
3;25122013505001;F;4;1001001;1001001_F_4;25;12;2013
4;24022012505001;F;5;1001001;1001001_F_5;24;2;2012
5;09032012505001;F;5;1001001;1001001_F_5;9;3;2012
6;21082011505001;F;6;1001001;1001001_F_6;21;8;2011
7;16082011505001;F;6;1001001;1001001_F_6;16;8;2011
8;21102011505002;F;6;1001001;1001001_F_6;16;8;2011
РЕДАКТИРОВАТЬ: я изменил свой код на что-то вроде этого: я заполняю список dicts с данными, а затем преобразую этот список в dataframe и сохранить как csv.Это займет около 30 минут, чтобы завершить
list_popravljeni = []
df = pd.read_csv(filename, delimiter=';')
df_dates = df.groupby(by=['dan_roj', 'mesec_roj', 'leto_roj']).size().reset_index()
for index, row in df_dates.iterrows():
df_candidates= df.loc[(df['dan_roj'] == dan_roj) & (df['mesec_roj'] == mesec_roj) & (df['leto_roj'] == leto_roj) ]
for index, row in df_candidates.iterrows():
vrstica = {}
vrstica['ID'] = row['identifikator']
vrstica['SPECIAL_ID'] = row['emso'][0:11] + str(index).zfill(2)
vrstica['day'] = row['day']
vrstica['MONTH'] = row['MONTH']
vrstica['YEAR'] = row['YEAR']
list_popravljeni.append(vrstica)
pd.DataFrame(list_popravljeni, columns=list_popravljeni[0].keys())