首页 > 编程语言 >Python按条件筛选、剔除表格数据并绘制剔除前后的直方图

Python按条件筛选、剔除表格数据并绘制剔除前后的直方图

时间:2024-07-20 13:30:06浏览次数:17  
标签:blue Python dif df 直方图 剔除 数据 red

  本文介绍基于Python语言,读取Excel表格文件数据,以其中某一列数据的值为标准,对于这一列数据处于指定范围所有行,再用其他几列数据的数值,加以数据筛选与剔除;同时,对筛选前、后的数据分别绘制若干直方图,并将结果数据导出保存为一个新的Excel表格文件的方法。

  首先,我们来明确一下本文的具体需求。现有一个Excel表格文件,在本文中我们就以.csv格式的文件为例;其中,如下图所示,这一文件中有一列(在本文中也就是days这一列)数据,我们将其作为基准数据,希望首先取出days数值处于045320365范围内的所有样本(一行就是一个样本),进行后续的操作。

image

  其次,对于取出的样本,再依据其他4列(在本文中也就是blue_difgreen_difred_difinf_dif4列)数据,将这4列数据不在指定数值区域内的行删除。在这一过程中,我们还希望绘制在数据删除前、后,这4列(也就是blue_difgreen_difred_difinf_dif4列)数据各自的直方图,一共是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文件中读取数据,并将其存储在名为dfDataFrame中。

  接下来,通过一系列条件筛选操作,从原始数据中选择满足特定条件的子集。具体来说,我们筛选出了在blue_difgreen_difred_difinf_dif4列中数值在一定范围内的数据,并将这些数据存储在名为blue_originalgreen_originalred_originalinf_original的新Series中,这些数据为我们后期绘制直方图做好了准备。

  其次,创建一个名为mask的布尔掩码,该掩码用于筛选满足条件的数据。在这里,它筛选出了days列的值在045之间或在320365之间的数据。

  随后,我们使用apply函数和lambda表达式,对于days列的值在045之间或在320365之间的行,如果其blue_difgreen_difred_difinf_dif4列的数据不在指定范围内,那么就将这列的数据随机设置为NaNp =[0.9, 0.1]则是指定了随机替换为NaN的概率。这里需要注意,如果我们不给出p =[0.9, 0.1]这样的概率分布,那么程序将依据均匀分布的原则随机选取数据。

  最后,我们使用dropna函数,删除包含NaN值的行,从而得到筛选处理后的数据。其次,我们依然根据这四列的筛选条件,计算出处理后的数据的子集,存储在blue_newgreen_newred_newinf_new中。紧接着,使用Matplotlib创建直方图来可视化原始数据和处理后数据的分布;这些直方图被分别存储在8个不同的图形中。

  代码的最后,将处理后的数据保存为新的.csv文件,该文件路径由result_file_path指定。

  运行上述代码,我们将得到8张直方图,如下图所示。且在指定的文件夹中看到结果文件。

  至此,大功告成。

标签:blue,Python,dif,df,直方图,剔除,数据,red
From: https://www.cnblogs.com/fkxxgis/p/18312992

相关文章

  • 千字长文讲解python装饰器
    1.装饰器是一个用于封装函数或类的代码的工具。它显式的将封装器应用到函数或类上,从而使它们选择加入到装饰器的功能中【装饰器不仅可以装饰函数,也可以装饰类】。2.对于①在函数运行前处理常见前置条件(例如确认授权),或②在函数运行后确保清理(例如输出清除或异常处理)装饰器都......
  • 蓝桥杯Python算法竞赛常用的函数库
    博客主页:音符犹如代码系列专栏:Python关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 【python模块】Selenium
    声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。文章目录Selenium库功能介绍环境准备示例代码Selenium库Selenium库是一个强大的Web自动化工具,允许开发者通过编写脚本来控制浏览器,实现......
  • 深入理解与高效操作Python中的字节流(bytes)与字节数组(bytearray)
    深入理解与高效操作Python中的字节流(bytes)与字节数组(bytearray)在Python编程中,处理字节流(bytes)和字节数组(bytearray)是常见的需求,尤其是在处理网络通信、文件I/O、以及需要直接与硬件交互的场景中。理解这两种数据类型的特性及它们之间的区别,并掌握高效的操作方法,对于提升程......
  • Python中的`@property`装饰器:深入解析与实战应用
    Python中的@property装饰器:深入解析与实战应用在Python中,@property装饰器是一种强大的工具,它允许类的方法被当作属性来访问。这一特性极大地增强了类的封装性和易用性,使得类的外部使用者可以像访问普通属性一样访问由方法计算或处理过的数据,而无需直接调用这些方法。本文将......
  • 【python模块】Http.client
    文章目录Http.client介绍基本用法高级用法Http.client介绍http.client是Python标准库中的一个模块,它提供了一个低级别的接口来发送HTTP请求和接收响应。这个模块主要针对HTTP协议的实现,并且可以用于创建更复杂的HTTP客户端。基本用法http.client模块允......
  • 掌握Python中的文件序列化:Json和Pickle模块解析
    Python文件操作与管理:Open函数、Json与Pickle、Os模块在Python中,文件是一个重要的数据处理对象。无论是读取数据、保存数据还是进行数据处理,文件操作都是Python编程中不可或缺的一部分。本文将详细介绍Python中文件操作的几种常用方法,包括open函数的使用、数据序列化与反......
  • PYTHON学习笔记(六、python数据结构--字典)
    (3)dict字典字典数据类型的含义是:根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成对应的关系。1、字典的创建方式1)使用{ }直接创建字典使用{ }创建字典的语法结构如下:d={key1:value1,key2:value2......}例如:#使用{}创建字典d=......
  • Python 爬虫技术 第01节 引言
    引言网络爬虫的概念和重要性网络爬虫(WebCrawler),也称为网络蜘蛛(WebSpider)或机器人(Bot),是一种自动浏览互联网并收集信息的程序。它们按照一定的规则,从一个网页链接到另一个网页,遍历整个网络,抓取所需的数据或信息。网络爬虫是搜索引擎、数据分析、市场研究、新闻聚合、学术......
  • 彩色文本,Python print() 居然还能这样玩?
    大家好,在学习Python编程的过程中,我们习惯于使用print()函数来输出文本。然而,许多人不知道的是,print()函数不仅能输出普通的黑白文本,还能输出彩色文本。原理终端与ANSI转义序列在深入代码之前,我们需要了解一些基础知识。终端(Terminal)是我们与操作系统交互的重要工具,而......