所以我试图打开一个CSV文件,读取它的字段并根据它修复一些其他字段,然后将这些数据保存回csv。我的问题是CSV文件有200万行。什么是加快这个速度的最好方法。
CSV文件包含
ID; DATE(d/m/y); SPECIAL_ID; DAY; MONTH; YEAR
我在计算记录中出现具有相同日期的行的频率,然后根据该数据更新SPECIAL_ID。
根据我之前的研究,我决定使用大熊猫。我将来会处理更大的数据集(1-2GB) - 这个数据大约是119MB,所以我找到一个很好的快速解决方案至关重要。
我的代码如下:
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字段中的替换为正确的数字。 例如,对于一行 ID = 2,SPECIAL_ID将是 26022018505001( - 被001替换)如果CSV中的其他人共享相同的DAY,MONTH,YEAR __-将被替换为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())
答案 0 :(得分:2)
我认为这会给你所寻找的东西并避免循环。可能它可能更有效(我无法找到避免创建counts
的方法)。但是,它应该比您当前的方法快得多。
df['counts'] = df.groupby(['year', 'month', 'day'])['SPECIAL_ID'].cumcount() + 1
df['counts'] = df['counts'].astype(str)
df['counts'] = df['counts'].str.zfill(3)
df['SPECIAL_ID'] = df['SPECIAL_ID'].str.slice(0, -3).str.cat(df['counts'])
我在最后添加了一个假记录,以确认它是否正确递增:
SPECIAL_ID sex age zone key day month year counts
0 13012016505001 F 1 1001001 1001001_F_1 13 1 2016 001
1 25122013505001 F 4 1001001 1001001_F_4 25 12 2013 001
2 24022012505001 F 5 1001001 1001001_F_5 24 2 2012 001
3 09032012505001 F 5 1001001 1001001_F_5 9 3 2012 001
4 21082011505001 F 6 1001001 1001001_F_6 21 8 2011 001
5 16082011505001 F 6 1001001 1001001_F_6 16 8 2011 001
6 21102011505002 F 6 1001001 1001001_F_6 16 8 2011 002
7 21102012505003 F 6 1001001 1001001_F_6 16 8 2011 003
如果你想摆脱counts
,你只需要:
df.drop('counts', inplace=True, axis=1)