我目前正在用熊猫编译一些数据帧,目前有 99 个工作簿,大约有 200,000 行数据和几列。该练习筛选这些列之一,并获取所有筛选数据的组合工作簿。
最初,我使用一个列表将所有过滤后的数据附加到一个数据帧,然后写出生成的 csv,如下所示:
appended_data=[]
for fname in os.listdir(readpath):
if 'xlsx' in fname:
ex_wbk = os.path.join(readpath + fname)
try:
fName = os.path.join(readpath + "\" + fname)
fBase = os.path.basename(fName)
df = pd.read_excel(fName, index = False, index_col=None, na_values='')
df.drop(df.iloc[:, 2:4], inplace = True, axis = 1)
df.dropna(subset=['Data Line'], inplace=True)
appended_data.append(df)
errorbook = ex_wbk
except OSError:
print(str(errorbook) + " Workbook in use")
pass
appended_data = pd.concat(appended_data, sort=True)
appended_data.to_excel(home, header=False, index=False)
这需要 789 秒才能运行
然后,我想到只用过滤的数据制作每个工作簿的 csv 文件并编译所有这些。如下:
for filename in os.listdir(homedir):
if filename.endswith(".xlsx"):
fName = os.path.join(homedir + "\" + filename)
fBase = os.path.basename(fName)
fRaw = os.path.splitext(fBase)[0]
df = pd.read_excel(fName, index = False)
df.drop(df.iloc[:, 2:4], inplace = True, axis = 1)
df.dropna(subset=['Data Line'], inplace=True)
df.to_csv(path_or_buf=home, header=True, index=False)
all_files = glob.glob(homedir + "/*.csv")
df = pd.concat((pd.read_csv(f) for f in all_files))
os.path.join(path, "*.csv")
df.to_csv ("D:\Users\cdoyle\Desktop\short\combined_csv.csv", index=False, encoding='utf-8-sig')
这需要 610 秒才能运行
有没有比上述更快的方法?
你有没有分析过你的代码?没有它,您将无法真正知道在哪里可以获得最大的好处,也很难做出良好的猜测。
不过,我注意到您正在阅读电子表格,只有在它加载到内存中后才会丢弃几列。如果您之前已经将其委托给读者,您可能会得到一些改进:
column_indices_to_preserve = […]
pd.read_excel(…, usecols=column_indices_to_preserve)
这将阻止您至少对数据进行一次额外的传递,这是可取的。它还将减少每个数据结构的内存占用。