使用 glob 导入多个 excel 文件并对其进行迭代处理并从结果中提取数据框

问题描述

我在一个文件夹中总共有 28 个 excel 文件。它们中的每一个都包含 72 列(71 个变量和 1 个目标)。使用下面的代码,我尝试预测 1 个 excel 文件的目标值,最终结果应该是 A、B、C 和 D。

如何使用glob,让代码读取所有excel文件,做预测过程,最后将每个excel文件的最终结果(A、B、C、D)放到新数据框的一行中(row1=excel1,row2=excel2 和...)

import numpy as np
import pandas as pd                                                                   
import glob                                                                 
for file in list(glob.glob('*.xlsx')): 

   data = pd.read_excel(file)
   X = data.drop(['HWD'],1)
   Y = data['HWD']

   # Split DataSet to Train & Test
   from sklearn.model_selection import train_test_split
   X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=0)
   # Prediction 1
   from sklearn.tree import DecisionTreeRegressor
   from sklearn.ensemble import AdaBoostRegressor
   ABR = AdaBoostRegressor()
   ABR.fit(X_train,y_train)
   ABRtest=ABR.predict(X_test)

   # Calculate metrics 1
   from sklearn.metrics import mean_squared_error
   import math
   from scipy.stats import variation 
   from sklearn.metrics import mean_poisson_deviance

   df_list = []
   a = pd.DataFrame({'Obs':(y_test),'Pre':(ABRtest)})
   df_list.append(a)
   column_1 = a["Obs"]
   column_2 = a["Pre"]
   A = column_1.corr(column_2)
   MSE = mean_squared_error(column_1,column_2)
   B = math.sqrt(MSE)
   C = variation(column_2,axis = 0)
   D = mean_poisson_deviance(column_1,column_2)

e 下面是每个 excel 的最后一行,我需要一个代码来构建一个包含每个文件结果的 28 行数据框。

df_list = []
e = pd.DataFrame({'CC':[A],'RMSE':[B],'RSD':[C],'MPD':[D]})
df_list.append(e)

解决方法

您可以使用 df.append() 在现有 df 下方添加行

e = pd.DataFrame()   #initiate an empty df
for i in range(28):
    A,B,C,D = i,i,i   #assume you have the results here
    e = e.append(pd.DataFrame({'CC':[A],'RMSE':[B],'RSD':[C],'MPD':[D]}))
e.reset_index(drop=True,inplace=True)

这是您想要的输出吗?

    CC RMSE RSD MPD
0   0   0   0   0
1   1   1   1   1
2   2   2   2   2
...
25  25  25  25  25
26  26  26  26  26
27  27  27  27  27

插入代码:

import glob
e = pd.DataFrame({'CC':[],'RMSE':[],'RSD':[],'MPD':[]},dtype='object')   #<--insert here,initiate an empty df                                                                
for file in list(glob.glob('*.xlsx')): 
    data = pd.read_excel(file)
    ...
    C = variation(column_2,axis = 0)
    D = mean_poisson_deviance(column_1,column_2)
    e = e.append(pd.DataFrame({'CC':[str(A)],'RMSE':[str(B)],'RSD':[str(C)],'MPD':[str(D)]}))   #<--insert here
e.reset_index(drop=True,inplace=True)   #<--insert this line outside for-loop