本文介紹基於Python語言,針對一個資料夾下大量的Excel表格檔案,對其中的每一個檔案加以操作——將其中指定的若干列的資料部分都向上移動一行,並將所有操作完畢的Excel表格檔案中的資料加以合併,生成一個新的Excel檔案的方法。
首先,我們明確一下本文的需求。在一個資料夾內,有大量的Excel表格檔案(以.csv
格式檔案為例),其中每一個檔案都有著類似如下圖所示的資料特徵;我們希望,對於下圖中紫色框內的列,其中的資料部分(每一列都有一個列名,這個列名不算資料部分)都向上提升一行(比如原本資料部分的第2
行變到第1
行,原本第3
行變到第2
行,以此類推)。
由上圖也可以看到,需要加以資料操作的列,有的在原本資料部分的第1
行就沒有資料,而有的在原本的資料部分中第1
行也有資料;對於後者,我們在資料向上提升一行之後,相當於原本第1
行的資料就被覆蓋掉了。此外,很顯然在每一個檔案的操作結束後,加以處理的列的資料部分的最後一行肯定是沒有資料的,因此在合併全部操作後的檔案之前,還希望將每一個操作後檔案的最後一行刪除。
知道了需求,我們就可以開始程式碼的撰寫;具體程式碼如下。
# -*- coding: utf-8 -*-
"""
Created on Fri May 19 01:47:06 2023
@author: fkxxgis
"""
import os
import pandas as pd
original_path = "E:/01_Reflectivity/25_2022Data_New"
result_path = "E:/01_Reflectivity/99_Model/02_Extract_Data/26_Train_Model_New"
result_df = pd.DataFrame()
for file in os.listdir(original_path):
if file.endswith(".csv"):
df = pd.read_csv(os.path.join(original_path, file))
columns_move_index = list(range(8, 16)) + list(range(17, 36))
for columns_index in columns_move_index:
for i in range(len(df) - 1):
df.iat[i, columns_index] = df.iat[i + 1, columns_index]
if len(df):
df = df.drop(len(df) - 1)
# df = df.iloc[ : , 1 : ]
result_df = pd.concat([result_df, df])
result_df.to_csv(os.path.join(result_path, "Train_Model_0715_Main.csv"), index = False)
其中,original_path
表示存放有多個待處理的Excel表格檔案的資料夾路徑,result_path
則是結果Excel表格檔案的存放路徑。
首先,我們透過result_df = pd.DataFrame()
建立一個空的DataFrame,用於儲存處理後的資料。接下來,遍歷原始資料夾中的所有檔案,並找到資料夾內以.csv
結尾的檔案;隨後,讀取這些.csv
檔案,並將其儲存到df
中。
其次,我們透過columns_move_index = list(range(8, 16)) + list(range(17, 36))
指定需要移動資料的列的索引範圍,並隨後遍歷需要移動資料的列。接下來的df.iat[i, columns_index] = df.iat[i + 1, columns_index]
表示將當前行的資料替換為下一行對應的資料。
接下來,我們透過if len(df):
判斷是否DataFrame不為空,如果是的話就刪除DataFrame中的最後一行資料;隨後,將處理後的DataFrame連線到result_df
中。
最後,我們透過result_df.to_csv()
函式,將最終處理後的DataFrame儲存為一個新的Excel表格檔案,從而完成我們的需求。
至此,大功告成。