我正在使用400.000行数据框(实际上,它更大,但出于测试目的,我使用此维度)。
我需要根据两个条件将多个文件导出到txt / csv:#RIC和日期。
在这些条件下循环是一个非常缓慢的过程,因此我正在寻找一种更快的方法来实现。
那是我最初的想法:
def SaveTxt(df, output_folder=None):
# Start time
start_time = time.time()
# Data Frame with date
df['Date'] = pd.to_datetime(df['Date-Time']).dt.date
dates = df['Date'].unique()
ticks = df['#RIC'].unique()
for tick in ticks:
for date in dates:
# print(date, tick)
# Filtering by instrument and date
temp_df = df[(df['#RIC'] == tick) & (df['Date'] == date)]
if temp_df.empty:
pass
else:
# Saving files
if output_folder in [None, ""]:
temp_df.to_csv("%s_%s.txt" % (date, tick))
else:
temp_df.to_csv("%s\\%s_%s.txt" % (output_folder, date, tick))
# Elapsed time
elapsed_time = time.time() - start_time
elapsed_time = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
# Priting elapsed time
print('Elapsed time: %s' % elapsed_time)
对于400.000行(相当于5天的数据),运行此脚本需要3分钟。一年的时间是6个小时,而我没有尝试10年,但是我认为这不是一个好主意。
解决思路
我试图从df中删除每个循环中使用的数据,但是这种情况不起作用(也许这将删除数据帧的大小,并使代码运行速度更快):
df = df[(df['#RIC'] != tick) & (df['Date'] != date)]
我相信这应该从数据框中删除每个刻度和日期,但是它是单独应用此条件的。
如果您能解决此问题,我将不胜感激。
谢谢
编辑
不知道这是否是共享数据样本的最佳方法(我无法在代理下上传)
#RIC日期价格量 DIJF21 16/10/2019 4.64 15 DIJF21 16/10/2019 4.64 40 DIJF21 16/10/2019 4.64 100 DIJF21 16/10/2019 4.64 5 DIJF21 16/10/2019 4.64 1765 DIJF21 16/10 / 2019 4.64 10 DIJF21 16/10/2019 4.64 100 DIJF21 16/10/2019 4.64 1000 DIJF21 16/10/2019 4.64 5 DIJF21 16/10/2019 4.64 20 DIJF21 16/10/2019 4.64 80 DIJF21 16/10/2019 4.64 25 DIJF21 16/10/2019 4.64 25 DIJF21 16/10/2019 4.64 150 DIJF20 15/10/2019 4.905 2000 DIJF20 15/10/2019 4.905 2000 DIJF20 15/10/2019 4.903 10
事先提供数据样本以测试答案会很有帮助。像这样,我只是希望它能正常工作;)
您应该能够将groupby与自定义函数一起使用,该函数将应用于每个组,如下所示:
def custom_to_csv(temp_df, output_folder):
date, tick = temp_df.name
# Saving files
if output_folder in [None, ""]:
temp_df.to_csv("%s_%s.txt" % (date, tick))
else:
temp_df.to_csv("%s\\%s_%s.txt" % (output_folder, date, tick))
df.groupby(['Date', '#RIC']).apply(custom_to_csv, (output_folder))
编辑:更改df
到temp_df
和(output_folder,)
到(output_folder)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句