【数据处理包Pandas】数据载入与预处理

目录

    • 一、数据载入
    • 二、数据清洗
      • (一)Pandas中缺失值的表示
      • (二)与缺失值判断和处理相关的方法
    • 三、连续特征离散化
    • 四、哑变量处理


准备工作

导入 NumPy 库和 Pandas 库。

import numpy as np
import pandas as pd

一、数据载入

对于数据分析而言,数据大部分来源于外部数据,如常用的 CSV 文件、 Excel 文件和数据库文件等。 Pandas 库将外部数据转换为 DataFrame 数据格式,处理完成后再存储到相应的外部文件中。

1、读 / 写文本文件

文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件。

txt 文件:是 Windows 操作系统上附带的一种文本格式,文件以 .txt 为后缀。

Pandas 中使用read_table来读取文本文件:
pd.read_table(filepath_or_buffer, sep=’\t’, header=’infer’, names=None, index_col=None, dtype=None, engine=None, nrows=None)

2、读 / 写 CSV 文件

CSV 文件:是 Comma-Separated Values 的缩写,用半角逗号(’ ,’ )作为字段值的分隔符。

Pandas 中使用read_csv函数来读取 CSV 文件:
pd.read_csv(filepath_or_buffer, sep=’ ,’ , header=’infer’, names=None, index_col=None, dtype=None, engine=None, nrows=None)

read_tableread_csv常用参数及其说明:

参数名称说明
filepath接收string,代表文件路径,无默认
sep接收string,代表分隔符。read_csv默认为 “,”,read_table默认为制表符 “\t”,如果分隔符指定错误,在读取数据的时候,每一行数据将连成一片
header接收int或sequence,表示将某行数据作为列名,默认为infer,表示自动识别
names接收array,表示列名,默认为None
index_col接收int、sequence或False,表示索引列的位置,取值为sequence则代表多重索引,默认为None
dtype接收dict,代表写入的数据类型(列名为key,数据格式为values),默认为None
engine接收c或者python,代表数据解析引擎,默认为c
nrows接收int,表示读取前n行,默认为None

文本文件的存储和读取类似,结构化数据可以通过 Pandas 中的to_csv函数实现以 CSV 文件格式存储文件。

DataFrame.to_csv(path_or_buf = None, sep = ’,’, na_rep, columns=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)

3、读 / 写 Excel 文件

Pandas 提供了read_excel函数读取 “xls” 和 “xlsx” 两种 excel 文件,其格式为:
pd.read_excel(io, sheetname, header=0, index_col=None, names=None, dtype)

read_excel函数和read_table函数的部分参数相同。

read_excel常用参数及其说明:

参数名称说明
io接收string,表示文件路径,无默认
sheetname接收string、int,代表excel表内数据的分表位置,默认为0
header接收int或sequence,表示将某行数据作为列名,默认为infer,表示自动识别
names接收int、sequence或者False,表示索引列的位置,取值为sequence则代表多重索引,默认为None
index_col接收int、sequence或者False,表示索引列的位置,取值为sequence则代表多重索引,默认为None
dtype接收dict,代表写入的数据类型(列名为key,数据格式为values),默认为None

将文件存储为 Excel 文件,可使用to_excel方法。其语法格式如下:
DataFrame.to_excel(excel_writer=None, sheetname=None’, na_rep=”, header=True, index=True, index_label=None, mode=’w’, encoding=None)

to_csv方法的常用参数基本一致,区别之处在于指定存储文件的文件路径参数excel_writer,增加了一个sheetnames参数,用来指定存储的 Excel sheet 的名称,默认为 sheet1 。

# 读取excel文件:
df_excel = pd.read_excel('员工表.xlsx')
df.head()

在这里插入图片描述

数据集员工表.xlsx下载地址:下载员工表.xlsx

二、数据清洗

(一)Pandas中缺失值的表示

Pandas 表示缺失值的一种方法是使用NaN(Not a Number),它是一个特殊的浮点数;另一种是使用 Python 中的None,Pandas 会自动把None转变成NaN

data = pd.Series([1, np.nan, 'hello', None])
data
0        1
1      NaN
2    hello
3     None
dtype: object

(二)与缺失值判断和处理相关的方法

  • isnull():判断每个元素是否是缺失值,会返回一个与原对象尺寸相同的布尔性 Pandas 对象
  • notnull():与isnull()相反
  • dropna():返回一个删除缺失值后的数据对象
  • fillna():返回一个填充了缺失值之后的数据对象

1、缺失值判断

data.isnull()
0    False
1     True
2    False
3     True
dtype: bool

判断缺失值的个数:

data.isnull().sum()
2

用布尔数组进行检索:

data[data.notnull()]
0        1
2    hello
dtype: object

2、删除缺失值

df = pd.DataFrame([[1,      np.nan, 2],
                   [2,      3,      5],
                   [np.nan, 4,      6]])
df.isnull().sum().sum()    # 统计缺失值的个数
2

在缺失值的处理方法中,删除缺失值是常用的方法之一。通过dropna方法可以删除具有缺失值的行。
dropna方法的格式:
dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

dropna的参数及其使用说明:

参数说明使用说明
axis默认为axis=0,当某行出现缺失值时,将该行丢弃并返回,当axis=1,当某列出现缺失值时,将该列丢弃
how表示删除的形式。any表示只要有缺失值存在就执行删除操作。all表示当且仅当全部为缺失值时执行删除操作。默认为any。
thresh阈值设定,当行列中非空值的数量少于给定的值就将该行丢弃
subset表示进行去重的列/行,如:subset=[ ’a’ ,’d’],即丢弃子列 a d 中含有缺失值的行
inplacebool取值,默认False,当inplace=True,即对原数据操作,无返回值

dropna默认删除任何包含缺失值的整行数据。

df.dropna()

在这里插入图片描述

使用axis=1axis='columns'删除任何包含缺失值的整列数据。

df.dropna(axis='columns')

在这里插入图片描述

更精确的缩小删除范围,需要使用howthresh(阈值)参数。

df[3] = np.nan
df

在这里插入图片描述

只有全为空值的列才会被删除。

df.dropna(axis='columns', how='all')

在这里插入图片描述

通过thresh参数,那些非缺失值的个数大于等于阈值的行或列将保留。

df.dropna(axis='rows', thresh=3)

在这里插入图片描述

3、填充缺失值

缺失值所在的特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;缺失值所在特征为类别型数据时,则选择众数来填充。

Pandas 库中提供了缺失值替换的方法fillna,格式如下:
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)

fillna参数说明:

参数名称参数说明
value用于填充缺失值的标量值或字典对象
method插值方式
axis待填充的轴,默认 axis=0
inplace修改调用者对象而不产生副本
limit(对于前向和后向填充)可以连续填充的最大数量

(1)用单个值填充

df.fillna(0)

在这里插入图片描述

(2)从前向后填充(forward-fill)

df.fillna(method='ffill')

在这里插入图片描述

(3)从后向前填充(back-fill)

df.fillna(method='bfill')

在这里插入图片描述

上面填充的方向默认是axis=0,即垂直方向填充;如果希望水平方向填充,需要设置axis=1

df.fillna(method='bfill',axis=1)

在这里插入图片描述

(4)插值法填充

下面的示例:线性插值、沿着水平方向从前向后填充

df.interpolate(method='linear', limit_direction='forward', axis=1)

在这里插入图片描述

上面的方法都不是原地修改原对象,如果需要原地修改,则需要设置inplace=True

print(df)
df.interpolate(method='linear', limit_direction='forward', axis=1,inplace=True)
df

在这里插入图片描述

3、处理重复数据

在 DataFrame 中利用duplicates方法判断各行是否有重复数据。duplicates方法返回一个布尔值的 series ,反映每一行是否与之前的行重复。

duplicates格式为:
DataFrame.duplicated(subset=None, keep='first')

  • subset:可选参数,用于指定要检查重复值的列名或列名列表。默认为 None,表示检查所有列。
  • keep:可选参数,指定如何处理重复值。可选值为 ‘first’、‘last’ 和 False。默认为 ‘first’,表示将第一个出现的重复值标记为 True,后续出现的标记为 False;‘last’ 表示将最后一个出现的标记为 True,前面出现的标记为 False;False 表示标记所有重复值为 True。
# 识别重复值——duplicated()、删除重复值——drop_duplicates()
df2 = pd.DataFrame({
    'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'],
    'style': ['cup', 'cup', 'cup', 'pack', 'pack'],
    'rating': [4, 4, 3.5, 15, 5]
})
df2

在这里插入图片描述

df2.duplicated()

在这里插入图片描述

df2.duplicated(keep=False)

在这里插入图片描述

# 只查看sytle列上的重复项
# 除第一个重复项外,其他重复项均标记为True
df2.duplicated('style')  

在这里插入图片描述

Pandas 通过drop_duplicates删除重复的行,格式为:
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)

  • subset:可选参数,用于指定要检查重复值的列名或列名列表。默认为 None,表示检查所有列。
  • keep:可选参数,指定如何处理重复值。可选值为 ‘first’、‘last’ 和 False。默认为 ‘first’,表示保留第一个出现的重复值;‘last’ 表示保留最后一个出现的重复值;False 表示删除所有重复值。
  • inplace:可选参数,指定是否在原地修改 DataFrame。默认为 False,表示返回一个新的 DataFrame;如果设为 True,则在原 DataFrame 上进行操作,并返回 None。
  • ignore_index:可选参数,指定是否重新设置索引。默认为 False,表示保留原索引;如果设为 True,则在删除重复值后重新设置索引。
df2.drop_duplicates(inplace=True)
df2

在这里插入图片描述

# 只删除brand列上的重复项
df2.drop_duplicates(['brand'],inplace=True)
df2

在这里插入图片描述

详情参考:https://www.gairuo.com/p/pandas-duplicated

三、连续特征离散化

series = pd.Series([1, 6, 7, 8, 9, 15])
series1 = pd.cut(series, bins=3)
print('离散化前的数据为:\n', series, '\n', '等宽离散化后的数据为:\n', series1)

print('离散化后各区间数据数目为:\n', series1.value_counts())
离散化前的数据为:
 0     1
1     6
2     7
3     8
4     9
5    15
dtype: int64 
 等宽离散化后的数据为:
 0     (0.986, 5.667]
1    (5.667, 10.333]
2    (5.667, 10.333]
3    (5.667, 10.333]
4    (5.667, 10.333]
5     (10.333, 15.0]
dtype: category
Categories (3, interval[float64]): [(0.986, 5.667] < (5.667, 10.333] < (10.333, 15.0]]
离散化后各区间数据数目为:
 (5.667, 10.333]    4
(10.333, 15.0]     1
(0.986, 5.667]     1
dtype: int64
def SameRateCut(data, k):
    w = data.quantile(np.arange(
            0, 1 + 1.0 / k, 1.0 / k))
    data = pd.cut(data, w)
    return data


series1 = SameRateCut(series, 3)
print('等频离散化后数据为:\n', series1, '\n',
      '离散化后数据各区间数目为:\n', series1.value_counts())

等频离散化后数据为:
 0               NaN
1      (1.0, 6.667]
2    (6.667, 8.333]
3    (6.667, 8.333]
4     (8.333, 15.0]
5     (8.333, 15.0]
dtype: category
Categories (3, interval[float64]): [(1.0, 6.667] < (6.667, 8.333] < (8.333, 15.0]] 
 离散化后数据各区间数目为:
 (8.333, 15.0]     2
(6.667, 8.333]    2
(1.0, 6.667]      1
dtype: int64

四、哑变量处理

dit = {'one': ['高', '低', '低', '高', '中'],
       'two': [1, 4, 6, 7, 8]}
df = pd.DataFrame(dit)
print('创建的DataFrame为:\n', df)
print('哑变量处理后的DataFrame为:\n', pd.get_dummies(df))   #又称为独热编码
创建的DataFrame为:
   one  two
0   高    1
1   低    4
2   低    6
3   高    7
4   中    8
哑变量处理后的DataFrame为:
    two  one_中  one_低  one_高
0    1      0      0      1
1    4      0      1      0
2    6      0      1      0
3    7      0      0      1
4    8      1      0      0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开机自启动

对win10,给一种开机自启动的设置方法: 1. winr 打开 2. 输入shell:startup打开 开始\程序\启动 3. 把想要自启动的应用的快捷方式放在这里即可 亲测有用

第十一届蓝桥杯物联网试题(省赛)

对于通信方面&#xff0c;还是终端A、B都保持接收状态&#xff0c;当要发送的数组不为空再发送数据&#xff0c;发送完后立即清除&#xff0c;接收数据的数组不为空则处理&#xff0c;处理完后立即清除&#xff0c;分工明确 继电器不亮一般可能是电压不够 将数据加空格再加\r…

RPA自动化小红书自动化写文以及发文!

1、视频演示 RPA自动化小红书自动写作发文 2、核心功能点 采集笔记&#xff1a;采集小红书上点赞量大于1000的爆款笔记 下载素材&#xff1a;下载爆款笔记的主图 爆款改写&#xff1a;根据爆款笔记的标题仿写新的标题以及新的文案 自动发布&#xff1a;将爆款笔记发布到小红…

Oracle RAC One Node,双胞胎变独生子?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

LeetCode刷题实战2:两数相加

在日常我们学习数据结构和算法的知识&#xff0c;一定不能只停留在看书、看视频层面&#xff0c;一定要自己多练习&#xff0c;纸上得来终觉浅&#xff0c;绝知此事要躬行。 题目内容 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存…

Vue3:组件间通信-$attrs的使用

一、情景说明 我们之前学习了通过props实现&#xff0c;父给子传数据 那么&#xff0c;如果&#xff0c;父组件给子组件传递多个数据&#xff0c;但是&#xff0c;子组件只用props声明了一个数据 其他数据去哪里了呢&#xff1f; 二、案例 1、父组件 <Child :a"a&…

Linux 关闭防火墙命令(新手)

关闭防火墙 查看防火墙状态 systemctl status firewalld.service 临时关闭防火墙&#xff08;重启失效&#xff09; systemctl stop firewalld.service 永久关闭防火墙 systemctl disable firewalld.servicesudo systemctl enable firewalld&#xff0c;这种方式输入命令…

AcWing 731. 毕业旅行问题(每日一题)

原题链接&#xff1a;731. 毕业旅行问题 - AcWing题库 此题难度较大&#xff0c;是2019年字节跳动校招题&#xff0c;里面涉及位运算与状态压缩DP&#xff0c;不会的可以去学习&#xff0c;此题根据个人量力而行。 建议看一下y总的讲解&#xff1a;AcWing 731. 毕业旅行问题&…

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

前言【Unity 实用工具篇】| Unity 实现背景模糊效果,简单易用一、实现背景模糊效果1.1 介绍1.2 效果展示1.3 使用说明及下载二、插件资源简单介绍2.1 导入下载好的资源2.2 功能介绍2.2.1 捕获特效2.2.2 高级选项

长连接详解

一分钟了解长连接 、短连接、心跳机制与断线重连 - 知乎 (zhihu.com) websocket 实现长连接原理_websocket 是长连接吗-CSDN博客

RedisDesktopManager 安装

简介&#xff1a;安装redis可视化工具 一、下载压缩包 Redis 可视化工具 链接&#xff1a;https://pan.baidu.com/s/1P2oZx9UpQbXDsxJ3GPUeOQ 提取码&#xff1a;6rft Redis 命令窗口版本 链接&#xff1a;https://pan.baidu.com/s/1mIuxCEWwD__aoqp1Cx8MFQ 提取码&#xf…

Linux 文件相关命令

一、查看文件命令 1&#xff09;浏览文件less 默认查看文件的前 10 行。 less /etc/services ##功能说明&#xff1a; #1.默认打开首屏内容 #2.按【回车】按行访问 #3.按【空格】按屏访问 #4.【从上向下】搜索用/111,搜索包含111的内容&#xff0c;此时按n继续向下搜&#x…

力扣刷题 45.跳跃游戏 II

目录 题干 解题思路 题干 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n…

稀碎从零算法笔记Day39-LeetCode:有向无环图中一个节点的所有祖先

感觉写的越来越难了hhh&#xff0c;一晚上只研究明白了2道题 题型&#xff1a;拓扑排序、BFS、图 链接&#xff1a;2192. 有向无环图中一个节点的所有祖先 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述&#xff08;红字为笔者添加&#xff0…

FPGA实现Canny算法(Verilog)

在边缘检测算法里面Sobel是比较简单的一个算法&#xff0c;但是其检测出来的边缘往往是比较粗的&#xff0c;效果不是很好&#xff0c;因为我们最理想的边缘肯定就是一个宽度为1的细线。 Canny算法在此基础上进行了改进&#xff0c;通过使用边缘的梯度信息进行非最大值抑制(NM…

基于单片机的数字万用表设计

**单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…

C++ | Leetcode C++题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; class Automaton {string state "start";unordered_map<string, vector<string>> table {{"start", {"start", "signed", "in_number", "end"}},{"signed…

Linux 多线程与线程控制(程序均有详细注释)

多线程与线程控制 线程的基本概念线程的特点页表多线程 线程控制线程的创建线程传参线程id资源回收---线程等待线程id和LWP 封装一个线程库线程互斥和线程同步线程互斥基本原理线程安全VS线程不安全锁的诞生可重入VS线程安全 死锁死锁的定义 线程同步条件变量接口 生成消费者模…

使用阿里云试用Elasticsearch学习:1.2 基础入门——数据输入和输出

什么是文档? 在大多数应用中&#xff0c;多数实体或对象可以被序列化为包含键值对的 JSON 对象。 一个 键 可以是一个字段或字段的名称&#xff0c;一个 值 可以是一个字符串&#xff0c;一个数字&#xff0c;一个布尔值&#xff0c; 另一个对象&#xff0c;一些数组值&#…

全流程基于GIS、python机器学习技术的地质灾害风险评价与信息化建库应用

入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重建中的应用方法&#xff1b;高阶篇&#xff1…