Pandas库基础知识(一)

2023-11-10

文章目录

pandas包依赖于 NumPy 包,提高了高性能易用数据类型和分析工具。

1 数据结构

1、 Series 数据结构

Series 是一种类似于一维数组的对象,由一组数据和一组数据标签(索引值)组成。
在这里插入图片描述

(1) Series对象的创建

通过Series()方法创建对象,也可以直接将标量值、列表、字典和ndarray类型转换成Series数据。series的索引可以是自动索引或自定义索引,索引个数必须跟创建series的数据个数相同

在这里插入图片描述

(2) Series对象的属性

获取数据:Series.values
获取名称:Series.name
获取index:Series.index
获取index的名称:Series.index.name

(3) Series对象的基本操作

import pandas as pd
s=pd.Series(range(5),['a','b','c','d','e'])
print(s[3],s['d'])  # 3 3
print(s[['a','b']],s[:2])  # a    0   (结果相同)
					 	   #b    1
print(s[s>3])   # e    4
print('e' in s,0 in s)  # True False
print(s.get('f',99))  # 99

2、 DataFrame 数据结构

DataFrame是由一组数据和一对索引(行索引和列索引)组成的表格型数据结构,常用于表达二维数据,同时也可以表达多维数据,行列索引有自动索引和自定义索引。
在这里插入图片描述

当你将列表或数组赋值给一个列时,值的长度必须和DataFrame的长度相匹配。如果你将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排列,并在空缺的地方填充缺失值

(1) DataFrame对象的创建

1、通过字典创建

df=pd.DataFrame(list/dict)

(2) DataFrame对象的属性

获得index:dataframe.index
获得columns:dataframe.columns
获取数据:dataframe.values
获取类型:dataframe.dtypes
获得维度信息:dataframe.ndim
获取shape信息:dataframe.shape
获取行及列索引:dataframe.axes
转置列表:dataframe.T
获取数据块元素的个数:dataframe.size

(3)类型转换

第一种方法

语法: df.astype('type')
功能描述: 将表格数据类型转换成指定的数据类型
返回情况: 返回一个修改数据类型后的数据

第二种方法

语法: df['column_name'].apply(‘type’)
功能描述: 将表格数据中的一列数据类型转换成指定的数据类型

时间字符串转换成日期类型数据:
1、df['字段名']=pd.to_datetime(df['字段名'],format=None) format是时间格式,时间格式跟df['字段名']相同
2、df['字段名']=df['字段名'].apply(lambda x:datetime.strptime(x,'%Y-%m-%d')) 时间格式跟x相同

3、Series和 DataFrame的互相转换

Series------》DataFrame:

Series.to_frame(['column_name']) # column_name选填参

DataFrame------》Series:

DataFrame[column_name]

2 导入与导出数据

一般导入数据会使用到pandas库中的read_x()方法,其中x代表数据文件的类型,例如:read_excel()、read_csv()、read_table()

1、excel文件

(1)导入数据

语法:pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=False, dtype= None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=None, mangle_dupe_cols=True, storage_options= None)
参数说明:
sheet_name: 指定工作表名称或索引,默认第一个工作表,如果填写None则返回所有工作表并且返回结果是一个字典类型数据
index_col: 指定行索引,默认从excel数据中的第0列开始
header: 指定列索引,默认从excel数据中的第0行开始
usecols: 指定数据导入时的列
skiprows: 设置跳过的行索引
keep_default_na: 空内容是否默认为NaN
parse_dates: 读取文件时按照指定的解析成日期格式的列
date_parser: 读取数据时按照该设置解析成日期格式,{ True(解析成日期并作为结果的index),[index0,index1] 或 [‘column_name1’ ,‘column_name1’] (对指定列解析日期),[[0,1,2]] (对指定列的数据解析日期并组合成一列),{‘new_column_name’:[0,1,2] ((对指定列的数据解析日期并组合成一列,指定列名)}

(2)导出数据

语法: DataFrame.to_excel(excel_writer, sheet_name= 'Sheet1', na_rep: = '', float_format:= None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None, storage_options= None)
参数说明:
excel_writer: 文件路径,文件后缀最好是xlsx格式
sheet_name: 要写入工作表的表名
na_rep: 表示缺失数据,不写默认为空
float_format: 浮点数据输出格式,如:%.2f
columns: 要写入的列
header: 数据的表头
index: 是否写入行索引
startrow: 写入的数据初始行
startcol: 写入的数据初始列
engine: 设置写引擎,{io.excel.xlsx.writer,io.excel.xls.writer 和 io.excel.xlsm.writer}
freeze_panes : 指定冻结窗口,整数的元组(长度2)
encoding: 编码方式

还有一种方法是采用ExcelWriter方法

with pd.ExcelWriter('output.xlsx') as writer:
	df1.to_excel(writer, sheet_name='Sheet_name_1')

具体用法可以查看我的另一篇文件python操作excel(xlrd、xlwt、xlwings、pandas)

2、 csv文件

(1)导入数据

df=padans.read_csv("文件路径"[,sep= ,nrows= , encoding=utf8/gbk  , engine=None])
# sep  定义分隔符,根据分隔符分隔csv中的数据返回结果给df,默认逗号分割(如csv数据不是用逗号分隔时会整行返回)
# nrows 指定返回csv数据中的行数
# encoding 指定编码方式
# engine  设置解析语言,参数值有python和c,所以路径中存在中文时会抛出OSError异常

当数据量很大时,可以修改engine参数,修改为pyarrow(仅限pandas1.4版本之后),也可以使用Parquet 数据格式

import pandas as pd
df = pd.read_csv("001.csv")
df.to_parquet("001.parquet", compression=None)
df = pd.read_parquet("001.parquet", engine="fastparquet")

(2)导出数据

df.to_csv(path,sep=',',na_rep='',columns=None,header=True,index=True,mode='w',encoding=None)
# mode:模式,'w'写入模式,'a'追加写入模式 

3、 txt文件

(1)导入数据

语法: padans.read_table(path,sep='\\t',delimiter='None',header='infer',na_filter=True)
参数说明:
sep: 定义分隔符,根据分隔符分隔文件中的数据返回结果给df
delimiter: 分隔符别名
header: 标题行,默认infer(自动推导)
usecols: 需要导入的列
nrows: 需要导入的行数
na_filter: 是否检查缺失值

read_table()方法是利用分隔符来分开文件并将分隔后的文件导入,它不仅可以导入.txt文件,还可以导入.csv文件。

4、 导入sql文件

(1)python与数据库连接

语法: pymysql.connect(host=None,user=None,password='',db/dtabase=None,charset='')
参数说明:
host: 数据库的ip地址,本地则填写127.0.0.0或localhost
user: 用户名
password: 密码
db: 数据库名
charset: 字符编码,一般填写utf8

有关Python操作数据库的具体教程请看

(2)导入sql文件

语法: pandas.read_aql(sql,con [, index_col])
参数说明:
sql: 是需要执行的sql语句
con: 第一步链接数据库的实例对象
index_col: 设置行索引

5、总结

数据格式 读取函数 写入函数
excel read_excel to_excel
csv read_csv / read_table to_csv
txt raad_table to_table
json read_json to_json
sql read_sql to_sql
html read_html to_html
剪贴板 read_clipboard to_clipboard
pkl read_pickle to_pickle

pkl文件的读取速度比csv文件读取速度快2倍 ,相比excel读取同样的容量的数据快379倍,object类型很占内存,可以将其转换为category类型,再转换成plk文件可以大大提高数据导入和处理效率。

import pandas as pd
df=pd.read_excel(r'C:\Users\Administrator\Desktop\1.xlsx')
df.to_pickle(r'C:\Users\Administrator\Desktop\1.pkl')
df=pd.read_pickle(r'C:\Users\Administrator\Desktop\1.pkl')
data=df[df['是否队长']=='是'][['省份','城市','姓名','队伍名称','手机号码']].set_index('队伍名称')
data['队员数']=df[df['性别及状态'].isin(['女活跃','男活跃'])].groupby('队伍名称').姓名.agg('count')
data.to_excel(r'C:\Users\Administrator\Desktop\result.xlsx')

3 数据预览

1、 控制显示行数

s[start_index:end_index] 切片的形式显示指定行数据
df.head( [ size ] ) 显示前size行,默认前5行
df.tail( [ size ] ) 显示后size行,默认后5行
df.sample( [ size ] ) 随机显示size行,默认1行

2、 获取数据表的大小

len(df) 获取df数据的总行数
df.shape 以元组形式返回数据表的总行数和列数(行数,列数)
df.count() 获取每列的有效个数,不包含无效值(Nan)

3、 获取数据类型

第一种方法: df.info() 返回整个数据表中所有列的数据类型,返回的结果包含行索引和列数
第二种方法: df [ 列名 ].dtype 返回指定列的数据类型
第三种方法: df.dtypes 返回每一列的数据类型

4、 获取数值分布情况

df.describe() 将数据表中数值类型中数据的均值、最值、方差和分位数返回

4 索引操作

1、修改columns

**第一种方法:**重新赋值

语法:data.columns=list
功能描述: 重新赋值列索引名
返回情况: 无返回,直接修改原值
注意: 此方法会直接全部列名都被修改

**第二种方法:**使用rename函数

语法: data.rename(columns={"columns_name":'new_columns_name'},inplace=True)
功能描述: 根据传入的参数,直接修改列索引名
返回情况: 根据inplace的参数值判断返回情况

2、修改index

第一种方法:

语法:df.set_index('columns_name'[,append=False,drop=True,inplace=False,verify_integrity=False])
功能描述: 将传入的列名设置为行索引
返回情况: 返回一个设置索引后的DataFrame
参数说明:
append: 是否保留原索引
drop: 该列被指定为索引后,values块是否删除该列
verify_integrity: 检查新索引是否存在重复项

第二种方法:

语法:df.reset_index((level=None,name=None,inplace=False,drop=False, col_level=0,col_fill='')
功能描述: 重置索引,重置的索引值为默认索引range(0,end)
返回情况: 根据inplace的参数值判断返回情况
注意:
  1、当drop=True时,直接丢弃原来的索引;若为Fales时,原索引被并入新的一列。
  2、当Series转换成DataFrame时,但inplace的参数值必须是False,否则抛出TypeError异常

第三种方法:

语法:df.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore') 没有指明columns时会直接默认为index
功能描述: 根据传入的参数,直接修改索引名
返回情况: 根据inplace的参数值判断返回情况
参数说明:
mapper: 具有映射关系的字典或函数
index: 行索引
columns: 列索引
axis: 轴方向

3、添加columns

第一种方法: 直接赋值添加 df['new_column']=new_values

第二种方法: 通过assign函数添加 df.assign(**kwargs)

第三种方法: 通过insert函数 df.insert(loc,item)

第四种方法: 通过df.columns.insert()方法 df.columns.insert(loc,item)

4、索引重排

当dataframe中的数据是字典类型时,转换成dataframe时列名没有顺序,可以使用reindex()方法重排索引

语法: df.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
功能描述: 对df数据中的列名重新排序
参数说明:
index / columns: 新的行列自定义索引
fill_value: 重排索引中,用于填充缺失位置的值
method: 填充方法,ffill当前值向前填充,bfill向后填充
limit: 最大填充量
copy: 是否生成相等的新对象

5、多重索引

(1)多重索引的建立
使用set_index方法:df.set_index(['column_name1','column_name2'])

(2)获取多重索引值

获取所有索引: df.index/columns.levels
获取指定层级的索引: df.index/columns.get_level_values(N) N一般为层级数
获取指定层级的索引值: df.index/columns.get_level_values(N).values N一般为层级数

(3)多重索引的访问

访问第一层: df[第一层索引名称或列表] / df[:]
访问第二层: df[:,第二层索引名称或列表] / df[:,:]

6、column添加前后缀

添加前缀: df.add_prefix(prefix:'str')
添加后缀: df.add_suffix(prefix:'str')

7、其他方法

方法 功能描述
df.columns / index.append(idx) 连接另一个index对象,产生新的index对象
df.columns / index.diff(idx) 计算差集
df.columns / index.intersection(idx) 计算交集
df.columns / index.union(idx) 计算并集
df.columns / index.insert(loc,item) 向位置loc中插入item元素
df.columns / index.delete(loc) 删除loc位置上的元素

5 数据增删改查

1、数据访问

(1)直接访问

  1. 通过行列索引名访问:df[ column_name] (返回一列的值且是Series类型) / df[column_name][index_name] (返回一个值)

在这里插入图片描述

  1. 通过切片访问 :df[ start_index : end_index ]

  2. 调用values属性:df.values (以ndarray的类型返回数据)

在这里插入图片描述

(2)loc方法 (通过行列索引名称或切片来取数据)

在这里插入图片描述

(3)iloc方法(通过行列下标来取数据)

在这里插入图片描述

(4)条件筛选

  1. 筛选条件

语法: df[df[条件]]
功能描述: 筛选出符合条件的并返回符合条件的数据
注意:
1.多个条件筛选时:df[(df[条件])|(df[条件])] / df[(df[条件])&(df[条件])]
2.当条件筛选返回的bool结果为DataFrame时,无法筛选行,必须是series类型的bool才能通过df[]直接过滤False的行
在这里插入图片描述

  1. where()方法

语法:DataFrame.where(cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=<no_default>)
功能描述: 返回整个数据,但不符合条件的值为nan
参数说明: cond代表条件;other代表填充的数据

  1. mask()方法

语法:DataFrame.mask(cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=<no_default>)
功能描述: 返回整个数据,但符合条件的值为nan
参数说明:
cond: 逻辑条件语句
other: 代表填充的数据

在这里插入图片描述

  1. query()方法

语法: DataFrame.query(expr, inplace= False, **kwargs)
功能描述: 根据expr参数筛选数据
参数说明:
expr: 条件字符串
inplace: 是否改变原数据

在这里插入图片描述

  1. isin()方法

语法: DataFrame.isin(values)
功能描述: values是否包含在数据框中,返回数据框里每个元素的存在情况(bool)

2、 数据修改与添加

针对数据的修改直接定位出位置再赋新的值即可修改数据,若定位的index不在原数据会创建新的index再赋值。

(1)数据赋值修改

df['columns_name']=value
data1.loc['index_name','columns_name']=value
data1.iloc[index,columns]=value

(2)数据替换

df.replace(to_replace='查找的字符', value='替换后的字符', regex=False, inplace = False,limit=None,method='pad')
# 查找的字符:当使用正则时,要求查找的字符是字符串类型  
# method : 填充方式,pad,ffill,bfill分别是向前、向前、向后填充
df.replace(['abc', '-'], ['aa', np.nan]) #将字符abc替换成aa,’-‘替换成NAN
df.replace({'aa': r'^C.$','bb':r'(a)'}, {'aa': 'unkonwn','bb':'CCC'}, regex=True) #将aa列长度为2以C开头非换行符结尾的字符都替换为‘unkonwn’,将bb列含有字母a的字符串中‘a’替换成‘CCC’

(3)数据追加

语法: df.append(other, ignore_index= False, verify_integrity= False, sort= False)
功能描述: 将一个或多个DataFrame或Series添加到DataFrame,并返回DataFrame,不修改原数据
参数说明:
other: 追加的数据
ignore_index : 是否忽略原索引,为 True 则重新进行自然索引
verify_integrity: 检查新索引是否存在重复项
sort: 是否排序

(4)数据合并

1、基于表格之间的合并

  1. concat()方法

语法: pd.concat(objs, axis=0, join='outer', ignore_index= False, keys=None, levels=None, names=None, verify_integrity= False, sort= False, copy= True)
功能描述: 数据行列拼接合并
参数说明:
axis: 连接轴方向(1–水平,0–垂直)
join: 连接方式(‘inner’内连接交集,‘outer’外连接并集)
ignore_index: 是否省略原索引重新分配索引
keys: 连接的键
levels: 索引级别
verify_integrity: 是否允许列名重复
sort: 是否排序

  1. merge()方法

语法: df.merge(right, how= 'inner', on= None, left_on= None, right_on= None, left_index= False, right_index= False, sort= False, suffixes= ('_x', '_y'), copy= True, indicator= False, validate= None)
功能描述: 数据横向合并,不过两者数据需要有关联
参数说明:
right: 合并的右表
how: 合并的方式 ,取值范围:{‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}
on: 合并的关联字段
left_on | right_on: 合并的左右表的关联字段,当左右表相关联的列名不同时可以使用这两个字段。注意这两个字段必须要一起使用,但是不能跟on同在
left_index | right_index: 是否让左右表的行索引作为连接键。注意这两个字段必须要一起使用
sort: 排序
suffixes: 后缀名,当两个合并表中相互之间出现相同列名时,合并后的列名都会带有后缀名。

两者区别:
merge方法类似于sql中的join连接,而concat方法则类似于sql的union all

2、基于数据的合并
行间数据合并

列间数据合并

(5)数据插入

语法: df.insert(loc, column, value, allow_duplicates= False)
功能描述: 向指定的列插入数据
参数说明:
loc: 索引位置
column: 新列的列名
value: 新列的值
allow_duplicates: 是否允许列名重复

(6)添加新列

语法:df.assign(**kwargs)
功能描述: 添加列并返回修改后的数据

df=pd.DataFrame([1,2,3,4])
df=df.assign(number1=[x for x in range(4)],s=[55,44,33,22])
print(df)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas库基础知识(一) 的相关文章

随机推荐

  • Java中的assert使用

    1 assertion 断言 是jdk1 4才开始支持的新功能 主要在开发和测试时开启 为保证性能 在正式发布后通常是关闭 2 Java中assertion与C中的assertion的区别在于 1 Java中是使用assert关键字去实现其
  • Derby 的安装&配置

    Derby 的安装 配置 原文 http zetcode com db apachederbytutorial install 在接下来的页面中 我们将展示如何安装 Derby 并根据需要配置 Derby 我们从 db apache org
  • redis安装教程

    redis安装教程 redis安装 redis安装教程 1 下载redis 2 解压 3 移动 放到usr local 录下 4 进 redis 录 5 生成 6 测试 这段运 时间会较 如果出现错误 此时需要安装tcl 如下 安装完tcl
  • Vue学习33----第三方日历组件ele-calendar 的使用(结合了lodash中的_.filter,_.find,_.map)

    文档地址 https www npmjs com package ele calendar https github com xuyanming ele calendar 效果图 组件
  • 面试题记录-- 对于软件测试的理解,测试的核心,测试策略

    记录面试遇到的题 个人理解 关于测试核心 怎么做好测试等等的问题 其实总结都是为了 预防 预防 预防 预防缺陷 把缺陷扼杀在摇篮里 测试效率 接口测试 敏捷 测试 你怎么看测试 软件测试是什么 分为哪几个阶段 怎么看测试 测试 已知测试需求
  • Java虚拟机基础知识整理

    文章目录 Java虚拟机基础知识整理 一 JVM的体系结构 二 类加载器详解 三 沙箱安全机制 一 沙箱安全发展历史 二 沙箱基本组件 四 Native以及方法区和寄存器 一 Native本地方法 二 PC寄存器 三 方法区 五 栈 Sta
  • JSP(机器调度问题)使用java进行数学建模并调用cplex求解

    机器调度问题 JSP问题 描述为 在给定每个工件的加工流程 每个工件使用机器的序列及每个工件每道工序的加工时间确定的情况下 安排工件的加工顺序 使得待加工的工件在机器上进行加工的最大完工时刻最小 接着上次的JSP模型 https blog
  • golang docker client通过ssh调用远程主机的接口

    golang通过tcp方式连接调用远程主机docker的接口 可参考 https mp csdn net mp blog creation editor 126315928 本文主要是用Go通过ssh方式连接到远程主机 调用docker接口
  • 配置chrony时间同步服务

    一 chrony简介 chrony 的优势 更快的同步 从而最大程度减少了时间和频率误差 对于并非全天 24 小时运行的虚拟计算机而言非常有用 能够更好地响应时钟频率的快速变化 对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节能技术而言
  • Linux 免费学习路线大全,你想要的都在这里啦(持续更新,欢迎收藏❤️关注点赞加评论)

    为什么学 Linux 相比于 Windows Linux 免费 开源 安全 灵活 稳定 便于开发 所以更受企业青睐 甚至 90 以上 的企业应用都是用 Linux 服务器部署的 无论是前端 后端 算法 测试 运维等计算机相关岗位的同学 都建
  • Batch Normalization详解

    Batch Normalization 原理 1 Batch Normalization的提处背景 1 1 常见的帮助收敛的方法 在深度学习中 随着网络层数的加深 模型的收敛难度会越来越大 为了让模型更好的收敛 涌现出了各种各样的调参方法
  • Java8 HashMap源码解析

    HashMap底层数据结构 HashMap底层数据结构是 数组 链 如下图 当满足以下两个条件 链表会转为红黑树 1 数组长度等于或大于64 2 链表长度等于或大于8 如果数组长度小于64 链表长度等于或大于8 不会把链表转为红黑树 而是扩
  • SpringMVC中如何使用注解的方式实现文件上传呢?

    转自 SpringMVC中如何使用注解的方式实现文件上传呢 一 form表单注意事项 上传文件所处的表单 表单必须使用以下属性 enctype multipart form data method POST 二 applicationCon
  • vue-鉴权的两种方法之路由拦截

    vue中鉴权的两种方法 常用的鉴权有两种 一种是路由拦截 一种是动态路由 路由拦截 通过vue router的beforeEach方法进行每一次路由访问的拦截 判断拦截信息中是否有鉴权要求或者权限校验 以此来实现鉴权 如果权限不够 访问的路
  • 透视Matplotlib核心功能和工具包 - Seaborn工具包

    Seaborn是基于Matplotlib构建的功能强大的可视化工具 它使多变量探索性数据分析更加容易和直观 并且增加了一些新类型的图 并且其背景样式和颜色图更加令人愉悦 它具有许多内置的统计功能 使其成为统计数据分析的首选工具 它还具有非常
  • Web学习之TypeScript

    文章目录 一 TypeScript是什么 二 TypeScript配置 三 变量声明 四 解构 五 函数 六 类Class 七 模块Module 八 总结 九 学习资料 一 TypeScript是什么 TypeScript是JavaScri
  • PTA 7-38 等边三角形面积

    PTA 7 38 等边三角形面积 数学基础对于程序设计能力而言很重要 对于等边三角形面积 请选择合适的方法计算之 输入格式 测试数据有多组 处理到文件尾 每组测试输入1个实数表示等边三角形的边长 输出格式 对于每组测试 在一行上输出等边三角
  • Ubuntu 14.04 Tab补全忽略大小写

    0 前言 当目录名以大写字母开头时 通过cd命令进入该目录就不太方便 需要切换到大写输入 如果Tab补全可以忽略大小写的话 这个问题就引刃而解 1 设置方法 1 在 目录中创建 inputrc 2 打开 inputrc 添加如下设置 set
  • 面向产品分析的内容

    声明 本文是学习GB T 42859 2023 航天产品质量问题三个面向分析方法实施要求 而整理的学习笔记 分享出来希望更多人受益 如果存在侵权请及时联系我们 1 范围 本文件规定了航天产品质量问题三个面向分析方法实施的一般要求 程序和分析
  • Pandas库基础知识(一)

    文章目录 1 数据结构 1 Series 数据结构 1 Series对象的创建 2 Series对象的属性 3 Series对象的基本操作 2 DataFrame 数据结构 1 DataFrame对象的创建 2 DataFrame对象的属性