Python按條件刪除Excel表格資料的方法

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

  本文介紹基於Python語言,讀取Excel表格檔案,基於我們給定的規則,對其中的資料加以篩選,將不在指定資料範圍內的資料剔除,保留符合我們需要的資料的方法。

  首先,我們來明確一下本文的具體需求。現有一個Excel表格檔案(在本文中我們就以.csv格式的檔案為例),如下圖所示。

image

  其中,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)

  下面是對上述程式碼每個步驟的解釋:

  1. 匯入必要的庫:匯入了pandas庫,用於資料處理和操作。
  2. 定義檔案路徑:定義了原始檔案路徑original_file和結果檔案路徑result_file
  3. 讀取原始資料:使用pd.read_csv()函式讀取原始檔案資料,並將其儲存在DataFrame物件df中。
  4. 資料篩選:對DataFrame物件df進行多個條件的篩選操作,使用了邏輯運算子&和比較運算子進行條件組合。例如,其中的第一行df["inf"] >= -0.2df["inf"] <= 18就表示篩選出"inf"列的值在-0.218之間的資料;第二行df["NDVI"] >= -1df["NDVI"] <= 1則表示篩選出"NDVI"列的值在-11之間的資料,以此類推。
  5. 儲存結果資料:使用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物件加以一次性的篩選,不用每篩選一次就儲存一次了。

  執行本文提及的程式碼,我們即可在指定的結果資料夾下獲得資料篩選後的檔案了。

  至此,大功告成。

相關文章