本文介紹基於Python語言,讀取Excel表格檔案,基於我們給定的規則,對其中的資料加以篩選,將不在指定資料範圍內的資料剔除,保留符合我們需要的資料的方法。
首先,我們來明確一下本文的具體需求。現有一個Excel表格檔案(在本文中我們就以.csv
格式的檔案為例),如下圖所示。
其中,Excel表格檔案具有大量的資料,每一列表示某一種屬性,每一行表示某一個樣本;我們需要做的,就是對於其中的部分屬性加以資料篩選——例如,我們希望對上圖中第一列的資料進行篩選,將其中大於2
或小於-1
的部分選出來,並將每一個所選出的單元格對應的行直接刪除;同時,我們還希望對其他的屬性同樣加以篩選,不同屬性篩選的條件也各不相同,但都是需要將不符合條件的單元格所在的整行都刪除。最終,我們保留下來的資料,就是符合我們需要的資料,此時我們需要將其儲存為一個新的Excel表格檔案。
明白了需求,我們即可開始程式碼的撰寫;本文用到的具體程式碼如下所示。
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 7 15:40:50 2023
@author: fkxxgis
"""
import pandas as pd
original_file = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/23_Train_model_NoH/Train_Model_1_NoH.csv"
result_file = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/23_Train_model_NoH/Train_Model_1_NoH_New.csv"
df = pd.read_csv(original_file)
df = df[(df["inf"] >= -0.2) & (df["inf"] <= 18)]
df = df[(df["NDVI"] >= -1) & (df["NDVI"] <= 1)]
df = df[(df["inf_dif"] >= -0.2) & (df["inf_dif"] <= 18)]
df = df[(df["NDVI_dif"] >= -2) & (df["NDVI_dif"] <= 2)]
df = df[(df["soil"] >= 0)]
df = df[(df["inf_h"] >= -0.2) & (df["inf_h"] <= 18)]
df = df[(df["ndvi_h"] >= -1) & (df["ndvi_h"] <= 1)]
df = df[(df["inf_h_dif"] >= -0.2) & (df["inf_h_dif"] <= 18)]
df = df[(df["ndvi_h_dif"] >= -1) & (df["ndvi_h_dif"] <= 1)]
df.to_csv(result_file, index = False)
下面是對上述程式碼每個步驟的解釋:
- 匯入必要的庫:匯入了
pandas
庫,用於資料處理和操作。 - 定義檔案路徑:定義了原始檔案路徑
original_file
和結果檔案路徑result_file
。 - 讀取原始資料:使用
pd.read_csv()
函式讀取原始檔案資料,並將其儲存在DataFrame物件df
中。 - 資料篩選:對DataFrame物件
df
進行多個條件的篩選操作,使用了邏輯運算子&
和比較運算子進行條件組合。例如,其中的第一行df["inf"] >= -0.2
和df["inf"] <= 18
就表示篩選出"inf"
列的值在-0.2
到18
之間的資料;第二行df["NDVI"] >= -1
和df["NDVI"] <= 1
則表示篩選出"NDVI"
列的值在-1
到1
之間的資料,以此類推。 - 儲存結果資料:使用
to_csv()
函式將篩選後的DataFrame物件df
儲存為新的.csv
檔案,儲存路徑為result_file
,並設定index=False
以避免儲存索引列。
當然,如果我們需要對多個屬性(也就是多個列)的資料加以篩選,除了上述程式碼中的方法,我們還可以用如下所示的程式碼,較之前述程式碼會更方便一些。
result_df = result_df[(result_df["blue"] > 0) & (result_df["blue"] <= 1) &
(result_df["green"] > 0) & (result_df["green"] <= 1) &
(result_df["red"] > 0) & (result_df["red"] <= 1) &
(result_df["inf"] > 0) & (result_df["inf"] <= 1) &
(result_df["NDVI"] > -1) & (result_df["NDVI"] < 1) &
(result_df["inf_dif"] > -1) & (result_df["inf_dif"] < 1) &
(result_df["NDVI_dif"] > -2) & (result_df["NDVI_dif"] < 2) &
(result_df["soil"] >= 0) &
(result_df["NDVI_dif"] > -2) & (result_df["NDVI_dif"] < 2) &
(result_df["inf_h_dif"] > -1) & (result_df["inf_h_dif"] < 1) &
(result_df["ndvi_h_dif"] > -1) & (result_df["ndvi_h_dif"] < 1)]
上述程式碼可以直接對DataFrame物件加以一次性的篩選,不用每篩選一次就儲存一次了。
執行本文提及的程式碼,我們即可在指定的結果資料夾下獲得資料篩選後的檔案了。
至此,大功告成。