Python按条件筛选、剔除表格数据并绘制剔除前后的直方图(示例代码)
作者:疯狂学习GIS
本文介绍基于Python语言,读取Excel表格文件数据,以其中某一列数据的值为标准,对于这一列数据处于指定范围的所有行,再用其他几列数据的数值,加以数据筛选与剔除;同时,对筛选前、后的数据分别绘制若干直方图,并将结果数据导出保存为一个新的Excel表格文件的方法。
首先,我们来明确一下本文的具体需求。现有一个Excel表格文件,在本文中我们就以.csv
格式的文件为例;其中,如下图所示,这一文件中有一列(在本文中也就是days
这一列)数据,我们将其作为基准数据,希望首先取出days
数值处于0
至45
、320
至365
范围内的所有样本(一行就是一个样本),进行后续的操作。
其次,对于取出的样本,再依据其他4
列(在本文中也就是blue_dif
、green_dif
、red_dif
与inf_dif
这4
列)数据,将这4
列数据不在指定数值区域内的行删除。在这一过程中,我们还希望绘制在数据删除前、后,这4
列(也就是blue_dif
、green_dif
、red_dif
与inf_dif
这4
列)数据各自的直方图,一共是8
张图。最后,我们还希望将删除上述数据后的数据保存为一个新的Excel表格文件。
知道了需求,我们就可以撰写代码。本文所用的代码如下所示。
# -*- coding: utf-8 -*- """ Created on Tue Sep 12 07:55:40 2023 @author: fkxxgis """ import numpy as np import pandas as pd import matplotlib.pyplot as plt original_file_path = "E:/01_Reflectivity/99_Model/02_Extract_Data/26_Train_Model_New/Train_Model_0715_Main_Over_NIR.csv" # original_file_path = "E:/01_Reflectivity/99_Model/02_Extract_Data/26_Train_Model_New/TEST.csv" result_file_path = "E:/01_Reflectivity/99_Model/02_Extract_Data/26_Train_Model_New/Train_Model_0715_Main_Over_NIR_New.csv" df = pd.read_csv(original_file_path) blue_original = df[(df['blue_dif'] >= -0.08) & (df['blue_dif'] <= 0.08)]['blue_dif'] green_original = df[(df['green_dif'] >= -0.08) & (df['green_dif'] <= 0.08)]['green_dif'] red_original = df[(df['red_dif'] >= -0.08) & (df['red_dif'] <= 0.08)]['red_dif'] inf_original = df[(df['inf_dif'] >= -0.1) & (df['inf_dif'] <= 0.1)]['inf_dif'] mask = ((df['days'] >= 0) & (df['days'] <= 45)) | ((df['days'] >= 320) & (df['days'] <= 365)) range_min = -0.03 range_max = 0.03 df.loc[mask, 'blue_dif'] = df.loc[mask, 'blue_dif'].apply(lambda x: x if range_min <= x <= range_max else np.random.choice([np.nan, x])) df.loc[mask, 'green_dif'] = df.loc[mask, 'green_dif'].apply(lambda x: x if range_min <= x <= range_max else np.random.choice([np.nan, x])) df.loc[mask, 'red_dif'] = df.loc[mask, 'red_dif'].apply(lambda x: x if range_min <= x <= range_max else np.random.choice([np.nan, x])) df.loc[mask, 'inf_dif'] = df.loc[mask, 'inf_dif'].apply(lambda x: x if range_min <= x <= range_max else np.random.choice([np.nan, x], p =[0.9, 0.1])) df = df.dropna() blue_new = df[(df['blue_dif'] >= -0.08) & (df['blue_dif'] <= 0.08)]['blue_dif'] green_new = df[(df['green_dif'] >= -0.08) & (df['green_dif'] <= 0.08)]['green_dif'] red_new = df[(df['red_dif'] >= -0.08) & (df['red_dif'] <= 0.08)]['red_dif'] inf_new = df[(df['inf_dif'] >= -0.1) & (df['inf_dif'] <= 0.1)]['inf_dif'] plt.figure(0) plt.hist(blue_original, bins = 50) plt.figure(1) plt.hist(green_original, bins = 50) plt.figure(2) plt.hist(red_original, bins = 50) plt.figure(3) plt.hist(inf_original, bins = 50) plt.figure(4) plt.hist(blue_new, bins = 50) plt.figure(5) plt.hist(green_new, bins = 50) plt.figure(6) plt.hist(red_new, bins = 50) plt.figure(7) plt.hist(inf_new, bins = 50) df.to_csv(result_file_path, index=False)
首先,我们通过pd.read_csv
函数从指定路径的.csv
文件中读取数据,并将其存储在名为df
的DataFrame中。
接下来,通过一系列条件筛选操作,从原始数据中选择满足特定条件的子集。具体来说,我们筛选出了在blue_dif
、green_dif
、red_dif
与inf_dif
这4
列中数值在一定范围内的数据,并将这些数据存储在名为blue_original
、green_original
、red_original
和inf_original
的新Series中,这些数据为我们后期绘制直方图做好了准备。
其次,创建一个名为mask
的布尔掩码,该掩码用于筛选满足条件的数据。在这里,它筛选出了days
列的值在0
到45
之间或在320
到365
之间的数据。
随后,我们使用apply
函数和lambda
表达式,对于days
列的值在0
到45
之间或在320
到365
之间的行,如果其blue_dif
、green_dif
、red_dif
与inf_dif
这4
列的数据不在指定范围内,那么就将这列的数据随机设置为NaN,p =[0.9, 0.1]
则是指定了随机替换为NaN的概率。这里需要注意,如果我们不给出p =[0.9, 0.1]
这样的概率分布,那么程序将依据均匀分布的原则随机选取数据。
最后,我们使用dropna
函数,删除包含NaN值的行,从而得到筛选处理后的数据。其次,我们依然根据这四列的筛选条件,计算出处理后的数据的子集,存储在blue_new
、green_new
、red_new
和inf_new
中。紧接着,使用Matplotlib创建直方图来可视化原始数据和处理后数据的分布;这些直方图被分别存储在8
个不同的图形中。
代码的最后,将处理后的数据保存为新的.csv
文件,该文件路径由result_file_path
指定。
运行上述代码,我们将得到8
张直方图,如下图所示。且在指定的文件夹中看到结果文件。
到此这篇关于Python按条件筛选、剔除表格数据并绘制剔除前后的直方图的文章就介绍到这了,更多相关Python绘制直方图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!