Python实现多条件筛选Excel数据并批量绘制直方图

 更新时间:2023年09月15日 08:35:18   作者:疯狂学习GIS  
这篇文章主要为大家介绍了如何Python对Excel数据进行多条件筛选和去除并批量绘制直方图,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下

本文介绍基于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 列的数据不在指定范围内,那么就将这列的数据随机设置为NaNp =[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实现多条件筛选Excel数据并批量绘制直方图的详细内容,更多关于Python绘制直方图的资料请关注脚本之家其它相关文章!

相关文章

  • python3操作mysql数据库的方法

    python3操作mysql数据库的方法

    这篇文章主要介绍了python3操作mysql数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Python json转字典字符方法实例解析

    Python json转字典字符方法实例解析

    这篇文章主要介绍了Python json转字典字符代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Python 专题一 函数的基础知识

    Python 专题一 函数的基础知识

    本文从系统提供的内部函数、第三方提供函数库+简单爬出代码及安装httplib2模块过程和用户自定函数三个方面进行讲述。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • python捕获警告的三种方法

    python捕获警告的三种方法

    这篇文章主要介绍了python捕获警告的三种方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • 解决pycharm无法识别本地site-packages的问题

    解决pycharm无法识别本地site-packages的问题

    今天小编就为大家分享一篇解决pycharm无法识别本地site-packages的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python实现简单猜拳游戏

    Python实现简单猜拳游戏

    这篇文章主要为大家详细介绍了Python实现简单猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 在python中利用GDAL对tif文件进行读写的方法

    在python中利用GDAL对tif文件进行读写的方法

    今天小编就为大家分享一篇在python中利用GDAL对tif文件进行读写的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python将字典内容存入mysql实例代码

    python将字典内容存入mysql实例代码

    这篇文章主要介绍了python将字典内容存入mysql实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 一文教会你调整Matplotlib子图的大小

    一文教会你调整Matplotlib子图的大小

    Matplotlib的可以把很多张图画到一个显示界面,这就设计到面板切分成一个一个子图,下面这篇文章主要给大家介绍了关于调整Matplotlib子图大小的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Python使用dir函数实现快速定位模块详解

    Python使用dir函数实现快速定位模块详解

    在Python的探索之旅中,dir()函数就像一把万能的钥匙,能瞬间揭示对象的内部结构,下面小编就和大家详细介绍一下Python使用dir函数实现快速定位模块的具体方法和常见问题解决
    2026-06-06

最新评论