この記事では、Python言語に基づいてExcelテーブル ファイルを読み取り、指定されたルールに基づいてテーブル ファイル内のデータをフィルタリングし、指定されたデータ範囲内にないデータを削除し、ニーズを満たすデータを保持する方法を紹介します。
まず、この記事の具体的なニーズを明確にしましょう。下図に示すようなExcelテーブル ファイル (この記事ではフォーマット ファイルを例に説明します)があります。.csv
その中で、Excelテーブル ファイルには大量のデータが含まれており、各列は特定の属性を表し、各行は特定のサンプルを表します。必要なのは、一部の属性についてデータをフィルタリングすることです。たとえば、次のようにしたいと考えています。まず、1 つの列のデータをフィルターし、より大きい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オブジェクトに対して複数の条件付きフィルタリング操作を実行します。たとえば、最初の行の合計は、列値がtoの間にあるデータをフィルターで除外することを意味し、2 行目の と は、列値がto の間にあるデータをフィルターで除外することを意味します。
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オブジェクトを保存するのではなく、一度に直接 DataFrame オブジェクトをフィルターできます。
この記事で説明されているコードを実行すると、指定した結果フォルダーの下にデータがフィルターされたファイルを取得できます。
ここまでで完了です。
注目してください: クレイジーな学習 GIS