Python將表格檔案中某些列的資料整體向上移動一行

疯狂学习GIS發表於2024-09-09

  本文介紹基於Python語言,針對一個資料夾下大量的Excel表格檔案,對其中的每一個檔案加以操作——將其中指定的若干列的資料部分都向上移動一行,並將所有操作完畢的Excel表格檔案中的資料加以合併,生成一個新的Excel檔案的方法。

  首先,我們明確一下本文的需求。在一個資料夾內,有大量的Excel表格檔案(以.csv格式檔案為例),其中每一個檔案都有著類似如下圖所示的資料特徵;我們希望,對於下圖中紫色框內的列,其中的資料部分(每一列都有一個列名,這個列名不算資料部分)都向上提升一行(比如原本資料部分的第2行變到第1行,原本第3行變到第2行,以此類推)。

image

  由上圖也可以看到,需要加以資料操作的列,有的在原本資料部分的第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表格檔案,從而完成我們的需求。

  至此,大功告成。

相關文章