Python學習筆記: 批次讀取excel檔案下所有的工作表(同一目錄下),彙整成一個dataframe

本文為網友於ithelp發問之解答:

網友有n個excel檔案,每個檔案中都有time、X、Y、Z工作表。
網友想要把每個excel檔案中「相同名稱」的工作表讀出來,並整合成同一個dataframe,
然後再來做後續的處理。

https://ithelp.ithome.com.tw/questions/10209617

import pandas as pd
import os

path = os.getcwd()
# List files:
files = os.listdir(path)
print(files)
files_xlsx = [f for f in files if f[-4:] == "xlsx"]
files_xls = [f for f in files if f[-3:] == "xls"]
files_xls.extend(files_xlsx)
for i, element in enumerate(files_xls):
    print(i, element)
print(len(files_xls))

print(files_xls)
['.ipynb_checkpoints', '1.xlsx', '2.xlsx', '3.xlsx', 'Untitled.ipynb']
0 1.xlsx
1 2.xlsx
2 3.xlsx
3
['1.xlsx', '2.xlsx', '3.xlsx']
import warnings
sh_list = ['time', 'X', 'Y', 'Z']

for s in sh_list:
    df = pd.DataFrame()
    print(f'工作表變數:{s}')
    for f in files_xls:
        data = pd.read_excel(f, sheet_name=s)        
        warnings.simplefilter("ignore") #不顯示讀檔驗證警告
        print(f'檔案名稱:{f},工作表{s}的原始資料筆數:{len(data)}')

        df = df.append(data, ignore_index=True) # 將所有檔案中相同名稱的工作表dataframe合併
    print(f'dataframe_{s}的總資料筆數:{len(df)}')
    
    
    exec('{} = df.copy()'.format('df_'+s)) # 將合併好的工作表dataframe存到一個新的名稱如df_time
工作表變數:time
檔案名稱:1.xlsx,工作表time的原始資料筆數:224
檔案名稱:2.xlsx,工作表time的原始資料筆數:475
檔案名稱:3.xlsx,工作表time的原始資料筆數:469
dataframe_time的總資料筆數:1168
工作表變數:X
檔案名稱:1.xlsx,工作表X的原始資料筆數:224
檔案名稱:2.xlsx,工作表X的原始資料筆數:475
檔案名稱:3.xlsx,工作表X的原始資料筆數:469
dataframe_X的總資料筆數:1168
工作表變數:Y
檔案名稱:1.xlsx,工作表Y的原始資料筆數:224
檔案名稱:2.xlsx,工作表Y的原始資料筆數:475
檔案名稱:3.xlsx,工作表Y的原始資料筆數:469
dataframe_Y的總資料筆數:1168
工作表變數:Z
檔案名稱:1.xlsx,工作表Z的原始資料筆數:224
檔案名稱:2.xlsx,工作表Z的原始資料筆數:475
檔案名稱:3.xlsx,工作表Z的原始資料筆數:469
dataframe_Z的總資料筆數:1168
print(len(df_time))
df_time.head()
1168
01
00.0NaN
10.0NaN
20.0NaN
30.0NaN
40.0NaN
print(len(df_X))
df_X.head()
1168
0.04102-0.10547-0.1748-0.134770.019040.056640.02539-0.09033-0.17432-0.1167-0.03516.2-0.02832.2-0.11523.1-0.17627.40.229490.410640.27441.20.1167.30.06006.40.06641.5
0-0.41943-0.100590.206050.270510.287600.17188-0.10596-0.21484-0.092290.29248NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10.051760.00586-0.03516-0.05371-0.018070.127440.166020.08838-0.03564-0.08008NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2-0.70557-0.48193-0.129880.297850.16455-0.249510.123540.353030.166500.15918NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
30.05127-0.27930-0.35889-0.21143-0.009770.081540.146970.284180.373050.26221NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
40.03027-0.59082-0.97949-0.635740.068850.477050.35059-0.04639-0.158200.07666NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

5 rows × 5559 columnsIn [5]:

print(len(df_Y))
df_Y.head()
1168
-0.15186-0.25-0.26367-0.2749-0.30957-0.38379-0.38428-0.37598-0.29883-0.146-0.00244.70.20654.2-0.01807.90.23584.20.3833.1-0.07617.3-0.37988-0.40771.10.12256.3-0.01562.5
0-0.235350.286130.490230.21631-0.24805-0.301270.090330.370610.402830.26025NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1-0.24512-0.16797-0.068360.061520.036130.005370.000000.045410.054200.04346NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
20.168460.250980.11035-0.08691-0.28906-0.31592-0.35693-0.27637-0.03125-0.00049NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
30.245610.358890.19336-0.07178-0.050290.227540.411130.26074-0.11621-0.23633NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4-0.16406-0.15771-0.09717-0.04883-0.03516-0.15869-0.18115-0.20459-0.152830.18359NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

5 rows × 5601 columnsIn [6]:

print(len(df_Z))
df_Z.head()
1168
-0.0210.055660.05078-0.01025-0.05762-0.06982-0.11768-0.06201-0.04785-0.102540.338870.05273.5-0.26855.20.16406.20.14258.20.17725.10.1416.40.19727.30.03223.9-0.38916.1
00.314450.10303-0.21191-0.162600.093750.10205-0.12402-0.23584-0.258790.00537NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10.10693-0.035160.02100-0.05566-0.049800.01221-0.001950.02100-0.02783-0.00635NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2-0.06006-0.10205-0.066890.398440.35645-0.059570.09863-0.01172-0.31250-0.13965NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3-0.14209-0.29150-0.091310.344730.562500.339360.04980-0.008300.108890.04736NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4-0.23535-0.20410-0.08936-0.10107-0.27344-0.30713-0.17334-0.04834-0.10400-0.18945NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

5 rows × 5298 columns

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *