pandas数据结构(Series和DataFrame)

简介: 无可非议,pandas是Python最强大的数据分析和探索工具之一,因金融数据分析工具而开发,支持类似于SQL语句的模型,可以对数据进行增删改查等操作,支持时间序列分析,也能够灵活的处理缺失的数据。它含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。这里所说的让pandas变得更快更简单的高级数据结构就是Series和DataFrame。要熟练使用pandas,首先得要熟悉它的这两个主要的数据结构:Series和DateFrame。

简介

无可非议,pandas是Python最强大的数据分析和探索工具之一,因金融数据分析工具而开发,支持类似于SQL语句的模型,可以对数据进行增删改查等操作,支持时间序列分析,也能够灵活的处理缺失的数据。它含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。

这里所说的让pandas变得更快更简单的高级数据结构就是Series和DataFrame。要熟练使用pandas,首先得要熟悉它的这两个主要的数据结构:SeriesDateFrame

本文将针对Series和DateFrame,介绍Series和DataFrame数据对象的创建及基于数据对象的基础上对数据进行选择、增加、删除等数据操作。

一、Series

Series是一种类似于一维数组对象,它是由一组的数据值value(各种NumPy数据类型)以及一组与之相关的数据标签index(即索引)组成,其中标签与数据值之间是一一对应的关系。

import pandas as pd
obj = pd.Series(['陈一','周二','张三','李四','王五','赵六','钱七','孙八','何九','顾十'])
obj

结果:

0    陈一
1    周二
2    张三
3    李四
4    王五
5    赵六
6    钱七
7    孙八
8    何九
9    顾十
dtype: object

Series的字符串表现形式为:索引在左边,值在右边。由于没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
Serires数据结构

可以通过Series的values和index属性获取其数组表示形式和索引对象。
通过Series的values和index属性获取其数组表示形式和索引对象

可以将Series看成一个定长的有序字典,因为它是索引值到数据值的一个映射。

1、Series对象创建

pandas 使用 Series() 函数来创建 Series 对象,通过这个对象可以调用相应的方法和属性,从而达到处理数据的目的:

import pandas as pd
obj=pd.Series( data, index, dtype, copy)

参数说明如下:

参数名称 描述
data 输入的数据,可以是列表、常量、ndarray 数组等。
index 索引值必须是惟一的,如果没有传递索引,则默认为 np.arrange(n)。
dtype dtype表示数据类型,如果没有提供,则会自动判断得出。
copy 表示对 data 进行拷贝,默认为 False。

data可以是列表、常量、ndarray数组等,如果数据被存放在一个Python字典dict中,也可以直接通过这个dict来创建Series,如果没有传入索引时会按照字典的键来构造索引;反之,当传递了索引时需要将索引标签与字典中的值一一对应。
前面的列子是通过列表来创建的Series,接下来看下通过ndarray和dic来创建Series。

通过ndarray创建Series

#ndarray创建Series
import pandas as pd
import numpy as np
data=np.array(['陈一','周二','张三','李四','王五','赵六','钱七','孙八','何九','顾十'])
obj= pd.Series(data)
print(obj)

结果:

0    陈一
1    周二
2    张三
3    李四
4    王五
5    赵六
6    钱七
7    孙八
8    何九
9    顾十
dtype: object

通过dict创建Series

通过dict创建Series,没有设置indx

import pandas as pd
data = {
   
   '1' :'张三', '2' :'李四', '3' : '王五'}
obj=pd.Series(data)
print(obj)

结果:

1    张三
2    李四
3    王五
dtype: object

当传递的索引值无法找到与其对应的值时,使用 NaN(非数字)填充。

#通过dict创建Series,设置indx
import pandas as pd
data = {
   
   '1' :'张三', '2' :'李四', '3' : '王五'}
obj=pd.Series(data,index=['1','2','4'])
#索引4没有在dict的对应的key,所以使用NaN(非数字)填充
print(obj)

结果:

1     张三
2     李四
4    NaN
dtype: object

2、Series操作

Series数据访问

Series提供了多种数据访问的方式,可以通过位置下标及索引来访问数据,可以访问单个数据也可以访问多个数据。

通过位置下标及索引来访问数据

import pandas as pd
import numpy as np
data=np.array(['陈一','周二','张三','李四','王五','赵六'])
obj= pd.Series(data,index=['一','二','三','四','五','六'])
print('obj的Series数据')
print(obj)
print('\n')
#位置下标访问
print('位置下标访问:obj[0]')
print(obj[0])
print('\n')
#切片访问
print('位置切片访问多个元素值:obj[1:3]')
print(obj[1:3])
print('\n')
#索引访问
print('索引访问:obj[obj.index==\'三\']')
print(obj[obj.index=='三'])
print('\n')
#索引访问
print('索引访问:obj[\'一\']')
print(obj['一'])
print('\n')
#索引列表访问
print('索引列表访问多个元素值:obj[[\'二\',\'三\']]')
print(obj[['二','三']])
print('\n')

结果:

obj的Series数据
一    陈一
二    周二
三    张三
四    李四
五    王五
六    赵六
dtype: object

位置下标访问:obj[0]
陈一

位置切片访问多个元素值:obj[1:3]
二    周二
三    张三
dtype: object

索引访问:obj[obj.index=='三']
三    张三
dtype: object

索引访问:obj['一']
陈一

索引列表访问多个元素值:obj[['二','三']]
二    周二
三    张三
dtype: object

head()&tail()查看数据

如果想要查看 Series 的某一部分数据,可以使用 head() 或者 tail() 方法。其中 head() 返回前 n 行数据,默认显示前 5 行数据。

import pandas as pd
import numpy as np
data=np.array(['陈一','周二','张三','李四','王五','赵六'])
obj= pd.Series(data,index=['一','二','三','四','五','六'])
#输出前三行数据
print('输出前三行数据')
print(obj.head(3))
print('\n')
#输出后两行数据
print('输出后两行数据')
print(obj.tail(2))
print('\n')

结果:

输出前三行数据
一    陈一
二    周二
三    张三
dtype: object

输出后两行数据
五    王五
六    赵六
dtype: object

Series数据增加

1.直接通过索引增加

#通过索引增加数据
obj['十一']='肖十一'
print(obj)

一      陈一
二      周二
三      张三
四      李四
五      王五
六      赵六
十一    肖十一
dtype: object

2.通过append()增加

#通过append()增加多个数据
obj2=pd.Series(['郭芙蓉','杨过'],index=['十二','十三'])
obj=obj.append(obj2)
print(obj)

结果:

一      陈一
二      周二
三      张三
四      李四
五      王五
六      赵六
十一    肖十一
十二    郭芙蓉
十三     杨过
dtype: object

Series数据修改

Series数据可以通过制定索引直接修改
如:修改索引为十一的数据,直接obj['十一']='肖XX',就可以进行修改。

#修改Series数据
obj['十一']='肖XX'
print(obj)

一      陈一
二      周二
三      张三
四      李四
五      王五
六      赵六
十一    肖XX
十二    郭芙蓉
十三     杨过
dtype: object

Series数据删除

通过drop()删除,注意如果没有带inplace=True,会返回一个新的Series对象。如果要修改本对象,注意要带上inplace=True

1.删除单个数据

obj.drop('十一',inplace=True)
print(obj)

一      陈一
二      周二
三      张三
四      李四
五      王五
六      赵六
十二    郭芙蓉
十三     杨过
dtype: object

2.删除多个数据

参数为索引列表,即可以删除索引为列表中的数据

obj.drop(['十二','十三'],inplace=True)
print(obj)

一    陈一
二    周二
三    张三
四    李四
五    王五
六    赵六
dtype: object

二、DataFrame

DataFrame 是 Pandas 的重要数据结构之一,也是在使用 Pandas 进行数据分析过程中最常用的结构之一。DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。DataFrame 的每一行数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列标签。因此 DataFrame 其实是从 Series 的基础上演变而来。可以把DataFrame看做是关系型数据库里或Excel里的一张表格来理解
DataFrame数据结构
DataFrame 数据结构的特点:
DataFrame 每一列的标签值允许使用不同的数据类型;
DataFrame 是表格型的数据结构,具有行和列;
DataFrame 中的每个数据值都可以被修改。
DataFrame 结构的行数、列数允许增加或者删除;
DataFrame 有两个方向的标签轴,分别是行标签和列标签;
DataFrame 可以对行和列执行算术运算。

1、DataFrame对象的创建

import pandas as pd
df=pd.DataFrame( data, index, columns, dtype, copy)

参数说明:

参数名称 说明
data 输入的数据,可以是 ndarray,series,list,dict,标量以及一个 DataFrame。
index 行标签,如果没有传递 index 值,则默认行标签是 np.arange(n),n 代表 data 的元素个数。
columns 列标签,如果没有传递 columns 值,则默认列标签是 np.arange(n)。
dtype dtype表示每一列的数据类型。
copy 默认为 False,表示复制数据 data。

Pandas 提供了多种创建 DataFrame 对象的方式可以看data的参数说明,包括列表、ndarray、series、dict等。
平时在数据分析过程中用得最多的应该是从其他数据源文件如cvs、excel、数据库、WEBAPI等方式加载数据到DataFrame中。
如:从Excel中加载数据。更多的数据加载方式见:http://xiejava.ishareread.com/posts/4864590d/

import pandas as pd
df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\staff.xlsx')
df

staff数据集

2、DataFrame数据操作

DataFrame 可以使用行索引(index )来选取 DataFrame 中的数据并进行操作。也可以使用列索(columns )引来完成数据的选取、添加和删除操作。

1) 行索引操作DataFrame

选取数据

行标签选取数据

#选取行标签为2的行
df.loc[[2]]

选取行标签为2的行
注意:如果是df.loc[2],同样是选择行标签为2的行,但现实效果为
选取行标签为2的行
因为df.loc[2]返回是Series对象,而df.loc[[2]]返回的是DataFrame对象

type(df.iloc[2])
pandas.core.series.Series
type(df.loc[[2]])
pandas.core.frame.DataFrame

切片选取数据

#切片选取数据(左闭右开)
df[2:4]

切片选取数据

增加行

添加数据行,使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行。

df_1 = pd.DataFrame([[11,'肖十一','30','女','7000','1'],[12,'郭芙蓉','30','女','7400','1']],index=[11,12],columns = ['staff_id','staff_name','staff_age','staff_gender','staff_salary','staff_depatment_id'])
df=df.append(df_1)
df

 添加数据行

注意新增加的DataFrame如果没有指定行索引,将会默认从0开始,添加数据行后将会有行重复的行索引。如没有指定index=[11,12]

df_1 = pd.DataFrame([[11,'肖十一','30','女','7000','1'],[12,'郭芙蓉','30','女','7400','1']],columns = ['staff_id','staff_name','staff_age','staff_gender','staff_salary','staff_depatment_id'])
df=df.append(df_1)
df

添加数据行有重复行索引

删除行

可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除

df=df.drop(0)
df

可以看到到行索引为0的两条记录被一起删除了。
删除

2) 列索引操作DataFrame

列索引选取数据列

通过指定列索引来选取数据列,如选择只显示staff_id,staff_name,staff_gender三列

df2=df[['staff_id','staff_name','staff_gender']]
df2

列索引选取数据列

列索引添加数据列

df3=df['staff_salary']+500
#在df的基础上增加append_cloume列,新增的append_cloume列为df['staff_salary']+500,即薪水加了500的列
df['append_cloume']=df3
df

列索引添加数据列

列索引删除数据列

通过del 来删除指定的数据列,如删除staff_depatment_id列

del df['staff_depatment_id']
df

列索引删除数据列

本文介绍了pandas的两大核心数据结构Series和DataFrame,分别介绍了Series和DataFrame数据对象的创建及基于数据对象的基础上对数据进行选择、增加、删除等数据操作,可以加深对Series和DataFrame的理解,并可以将创建,增、删、改、查等应用于实际的数据处理应用中。


作者博客:http://xiejava.ishareread.com/

目录
相关文章
|
3月前
|
SQL 索引 Python
Pandas中DataFrame合并的几种方法
Pandas中DataFrame合并的几种方法
203 0
|
25天前
|
SQL 数据采集 数据可视化
Pandas 数据结构 - DataFrame
10月更文挑战第26天
42 2
Pandas 数据结构 - DataFrame
|
25天前
|
索引 Python
Pandas 数据结构 - Series
10月更文挑战第26天
31 2
Pandas 数据结构 - Series
|
2月前
|
数据采集 数据可视化 数据挖掘
Pandas数据结构
‌Pandas提供了两种主要的数据结构
|
4月前
|
索引 Python
Pandas学习笔记之Dataframe
Pandas学习笔记之Dataframe
|
4月前
|
索引 Python
Pandas学习笔记之Series
Pandas学习笔记之Series
|
4月前
|
数据挖掘 大数据 数据处理
数据分析师的秘密武器:精通Pandas DataFrame合并与连接技巧
【8月更文挑战第22天】在数据分析中,Pandas库的DataFrame提供高效的数据合并与连接功能。本文通过实例展示如何按员工ID合并基本信息与薪资信息,并介绍如何基于多列(如员工ID与部门ID)进行更复杂的连接操作。通过调整`merge`函数的`how`参数(如'inner'、'outer'等),可实现不同类型的连接。此外,还介绍了使用`join`方法根据索引快速连接数据,这对于处理大数据集尤其有用。掌握这些技巧能显著提升数据分析的能力。
73 1
|
26天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
122 9
|
17天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
22 1
|
4天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
25 5