Series第八讲 重塑排序

Series第八讲 重塑排序,第1张

本节课将讲解Pandas-Series的重塑(Reshaping)与排序(sorting)。

重塑顾名思义即改变数据的形状。

首先导入所需依赖包

对value排序,返回一个新的Series,新Series的值是排序后的原value在原Series中的整数位置,NaN的位置为-1。(有点绕,通过下面例子图解会比较清晰易懂)

图解argsort:

返回Series中最小值的整数位置。

与Series.idxmin()比较: argmin返回的是最小值的整数位置,idxmin返回的是最小值的索引

返回Series中最大值的整数位置。

与Series.idxmax()比较: argmax返回的是最大值的整数位置,idxmax返回的是最大值的索引

使用输入顺序重新排列索引级别。重新排序MultiIndex的级别。

按值对Series排序。

按索引标签对Series进行排序。

MultiIndex的i级索引和j级索引交换位置。

数据透视,使用MultiIndex Series生成DataFrame。

将类似列表的每个元素转换为行,这些行的索引将重复。

插入元素应在的位置,插入点,原理应该是二分查找。

注意⚠️:Series必须单调排序,即Series必须是已经排好序的。

返回一个展平的ndarray。

重复Series的元素。

返回一个新Series,其中每个元素都连续重复给定次数。

具有单个元素的Series或DataFrames被压缩为标量。具有单列或单行的DataFrame被压缩为Series。否则,对象不变(感觉这个方法用处不大,可以用loc代替)。

创建一个Series的新视图。

注意⚠️:新视图值的修改会影响到原Series。

导入 Pandas:

查看 Pandas 版本信息:

Pandas 的数据结构:Pandas 主要有 Series(一维数组),DataFrame(二维数组),Panel(三维数组),Panel4D(四维数组),PanelND(更多维数组)等数据结构。其中 Series 和 DataFrame 应用的最为广泛。

Series 是一维带标签的数组,它可以包含任何数据类型。包括整数,字符串,浮点数,Python 对象等。Series 可以通过标签来定位。

DataFrame 是二维的带标签的数据结构。我们可以通过标签来定位数据。这是 NumPy 所没有的。

Pandas 中,Series 可以被看作由 1 列数据组成的数据集。

创建 Series 语法:s = pd.Series(data, index=index),可以通过多种方式进行创建,以下介绍了 3 个常用方法。

从列表创建 Series:

从 Ndarray 创建 Series:

从字典创建 Series:

修改 Series 索引:

Series 纵向拼接:

Series 按指定索引删除元素:

Series 修改指定索引元素:

Series 按指定索引查找元素:

Series 切片 *** 作:

Series 加法运算:

Series 的加法运算是按照索引计算,如果索引不同则填充为 NaN(空值)。

Series 减法运算:

Series的减法运算是按照索引对应计算,如果不同则填充为 NaN(空值)。

Series 乘法运算:

Series 的乘法运算是按照索引对应计算,如果索引不同则填充为 NaN(空值)。

Series 除法运算:

Series 的除法运算是按照索引对应计算,如果索引不同则填充为 NaN(空值)。

Series 求中位数

Series 求和:

Series 求最大值:

Series 求最小值:

与 Sereis 不同,DataFrame 可以存在多列数据。一般情况下,DataFrame 也更加常用。

通过 NumPy 数组创建 DataFrame:

通过字典数组创建 DataFrame:

查看 DataFrame 的数据类型:

预览 DataFrame 的前 5 行数据:

查看 DataFrame 的后 3 行数据:

查看 DataFrame 的索引:

查看 DataFrame 的列名:

查看 DataFrame 的数值:

查看 DataFrame 的统计数据:

DataFrame 转置 *** 作:

对 DataFrame 进行按列排序:

对 DataFrame 数据切片:

对 DataFrame 通过标签查询(单列):

对 DataFrame 通过标签查询(多列):

对 DataFrame 通过位置查询:

DataFrame 副本拷贝:

判断 DataFrame 元素是否为空:

添加列数据:

根据 DataFrame 的下标值进行更改。:

根据 DataFrame 的标签对数据进行修改:

DataFrame 求平均值 *** 作:

对 DataFrame 中任意列做求和 *** 作:

将字符串转化为小写字母:

将字符串转化为大写字母:

对缺失值进行填充:

删除存在缺失值的行:

DataFrame 按指定列对齐:

CSV 文件写入:

CSV 文件读取:

Excel 写入 *** 作:

Excel 读取 *** 作:

建立一个以 2018 年每一天为索引,值为随机数的 Series:

统计s 中每一个周三对应值的和:

统计s中每个月值的平均值:

将 Series 中的时间进行转换(秒转分钟):

UTC 世界时间标准:

转换为上海所在时区:

不同时间表示方式的转换:

创建多重索引 Series:

构建一个 letters = ['A', 'B', 'C'] 和 numbers = list(range(10))为索引,值为随机数的多重索引 Series。

多重索引 Series 查询:

多重索引 Series 切片:

根据多重索引创建 DataFrame:

创建一个以 letters = ['A', 'B'] 和 numbers = list(range(6))为索引,值为随机数据的多重索引 DataFrame。

多重索引设置列名称:

DataFrame 多重索引分组求和:

DataFrame 行列名称转换:

DataFrame 索引转换:

DataFrame 条件查找:

查找 age 大于 3 的全部信息

** 根据行列索引切片:**

DataFrame 多重条件查询:

查找 age<3 且为 cat 的全部数据。

DataFrame 按关键字查询:

DataFrame 按标签及列名查询。:

DataFrame 多条件排序:

按照 age 降序,visits 升序排列

DataFrame 多值替换:

将 priority 列的 yes 值替换为 True,no 值替换为 False。

DataFrame 分组求和:

使用列表拼接多个 DataFrame:

找出 DataFrame 表中和最小的列:

DataFrame 中每个元素减去每一行的平均值:

DataFrame 分组,并得到每一组中最大三个数之和:

当分析庞大的数据时,为了更好的发掘数据特征之间的关系,且不破坏原数据,就可以利用透视表 pivot_table 进行 *** 作。

透视表的创建:

新建表将 A, B, C 列作为索引进行聚合。

透视表按指定行进行聚合:

将该 DataFrame 的 D 列聚合,按照 A,B 列为索引进行聚合,聚合的方式为默认求均值。

透视表聚合方式定义:

上一题中 D 列聚合时,采用默认求均值的方法,若想使用更多的方式可以在 aggfunc 中实现。

透视表利用额外列进行辅助分割:

D 列按照 A,B 列进行聚合时,若关心 C 列对 D 列的影响,可以加入 columns 值进行分析。

透视表的缺省值处理:

在透视表中由于不同的聚合方式,相应缺少的组合将为缺省值,可以加入 fill_value 对缺省值处理。

在数据的形式上主要包括数量型和性质型,数量型表示着数据可数范围可变,而性质型表示范围已经确定不可改变,绝对型数据就是性质型数据的一种。

绝对型数据定义:

对绝对型数据重命名:

重新排列绝对型数据并补充相应的缺省值:

对绝对型数据进行排序:

对绝对型数据进行分组:

缺失值拟合:

在FilghtNumber中有数值缺失,其中数值为按 10 增长,补充相应的缺省值使得数据完整,并让数据为 int 类型。

数据列拆分:

其中From_to应该为两独立的两列From和To,将From_to依照_拆分为独立两列建立为一个新表。

字符标准化:

地点的名字都不规范(如:londON应该为London)需要对数据进行标准化处理。

删除坏数据加入整理好的数据:

将最开始的 From_to 列删除,加入整理好的 From 和 to 列。

去除多余字符:

如同 airline 列中许多数据有许多其他字符,会对后期的数据分析有较大影响,需要对这类数据进行修正。

格式规范:

在 RecentDelays 中记录的方式为列表类型,由于其长度不一,这会为后期数据分析造成很大麻烦。这里将 RecentDelays 的列表拆开,取出列表中的相同位置元素作为一列,若为空值即用 NaN 代替。

信息区间划分:

班级一部分同学的数学成绩表,如下图所示

但我们更加关心的是该同学是否及格,将该数学成绩按照是否>60来进行划分。

数据去重:

一个列为A的 DataFrame 数据,如下图所示

尝试将 A 列中连续重复的数据清除。

数据归一化:

有时候,DataFrame 中不同列之间的数据差距太大,需要对其进行归一化处理。

其中,Max-Min 归一化是简单而常见的一种方式,公式如下:

Series 可视化:

DataFrame 折线图

DataFrame 散点图

DataFrame 柱形图

19.1安装Anaconda

Anaconda是Python的一个开源发行版本,它预装了丰富的第三方库,而且主要面向科学计算和数据分析,使用起来要比原版的Python更省时省力。

Anaconda官方下载网址为:https://www.continuum.io/downloads。下载和安装的方法很简单,若有问题可以在网上搜索相关内容学习解决。

安装Anaconda之后,就会发现在Anaconda目录下同时安装了Jupyter Notebook、Spyder等工具,我们接下来主要使用Spyder进行开发。关于Spyder的使用方法非常简单,大家也可以去网上搜索学习。

虽然Anaconda已经预装了很多常用的包,但有时我们也需要自己安装一些包。可以在开始菜单中选择“Anaconda Anaconda Prompt”命令,在命令行输入conda install ( 代表包名)即可安装,也可以输入pip install 。

19.2数据分析包Pandas

Pandas是Python的一个数据分析包,Anaconda安装时已经附带安装了Pandas包。

Pandas数据结构有三种:Series(一维数组)、DataFrame(二维数组)和Panel(三维数组),其中最常用的是前两种数据结构。

19.2.1 Series

Series(序列)用于存储一行或一列数据,以及与之相关的索引的集合。

语法格式如下:

Series([数据1,数据2,......], index=[索引1,索引2,......])

例:

from pandas import Series

s=Series(['张三','李四','王五'],index=[1,2,3])

print(s)

输出结果如下:

1 张三

2 李四

3 王五

dtype: object

上面建立序列时指定了索引,若不指定,则默认的索引值从0开始。如下:

s=Series(['张三','李四','王五'])

输出结果为:

0 张三

1 李四

2 王五

dtype: object

索引值也可以为字符串。如下:

from pandas import Series

s=Series(['张三','李四','王五'],index=['A','B','C'])

print(s)

输出结果为:

A 张三

B 李四

C 王五

dtype: object

1、访问序列

(1)可以通过索引访问序列,如:

from pandas import Series

s=Series(['张三','李四','王五'])

print(s)

print(s[0])

print(s[1:])

运行结果如下:

0 张三

1 李四

2 王五

dtype: object #print(s)输出

张三 #print(s[0])输出

1 李四

2 王五

dtype: object #print(s[1:])输出

(2)通过值获取索引值

from pandas import Series

s=Series(['张三','李四','王五'],index=['A','B','C'])

print(s.index[s.values=='李四'])

运行结果:

Index(['B'], dtype='object')

(3)判断值是否存在

from pandas import Series

s=Series(['张三','李四','王五'],index=['A','B','C'])

f='李四' in s.values

print(f)

运行结果:

True

(4)定位获取

from pandas import Series

s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])

print(s[[0,2,1]])

运行结果:

A 张三

C 王五

B 李四

dtype: object

2、修改序列

(1)追加序列,如:

from pandas import Series

s=Series(['张三','李四','王五'],index=['A','B','C'])

s1=Series(['孙六'],index=['D'])

s=s.append(s1)

print(s)

运行结果:

A 张三

B 李四

C 王五

D 孙六

dtype: object

(2)修改序列的值

from pandas import Series

s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])

s[1]='李飞'

print(s)

运行结果:

A 张三

B 李飞

C 王五

D 孙六

dtype: object

不知道索引,仅知道要修改的值,也可通过值查找到索引后,再修改序列的值。如:

s[s.index[s.values=='李四']]='李飞'

这样也可以将“李四”修改为“李飞。

(3)修改索引

from pandas import Series

s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])

s.index=[0,1,2,3]

print(s)

运行结果:

0 张三

1 李四

2 王五

3 孙六

dtype: object

(4)删除元素

from pandas import Series

s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])

s=s.drop('A')

print(s)

运行结果:

B 李四

C 王五

D 孙六

dtype: object

(5)重新排序

可以按照索引排序,使用sort_index(ascending=True)方法对index进行排序 *** 作。

from pandas import Series

s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])

s=s.sort_index(ascending=False) # ascending=False表示按降序排列

print(s)

运行结果:

D 孙六

C 王五

B 李四

A 张三

dtype: object

(6)重置索引

重置索引可以使用reindex()。如果index列表中的元素多于序列的值,可用fill_value=0这样的语句填充。

s=s.reindex(['D','C','B','A'])

如果index列表中的元素多于序列的值,可用fill_value=0这样的语句填充。

s=s.reindex(['D','C','B','A'], fill_value=0)

19.2.2 DataFrame

DataFrame(数据框架)用于存储多行和多列的数据集合。它是Series的容器,类似于Excel中二维表格。

定义一个DataFrame的语法格式如下:

df=DataFrame({列名1 : 序列1,列名2 : 序列2,.......列名n : 序列n}, index=序列 )

例如,有如下二维表:

姓名

性别

年龄

张三

18

李四

19

王五

17

保存到DataFrame中可以用如下方法:

from pandas import Series

from pandas import DataFrame

name=Series(['张三','李四','王五'])

sex=Series(['男','女','男'])

age=Series([18,19,17])

df=DataFrame({'姓名':name,'性别':sex,'年龄':age})

print(df)

运行结果:

姓名 性别 年龄

0 张三 男 18

1 李四 女 19

2 王五 男 17

从上例可以看出,虽然我们省缺了索引,但系统自动添加了从0开始的索引值。

19.3 DataFrame的基本 *** 作

1、访问方式

(1)获取行

print(df[1:2]) # 获取第1行的值

输出结果:

姓名 性别 年龄

1 李四 女 19

print(df[1:3]) #获取第1行到第2行的值

输出结果:

姓名 性别 年龄

1 李四 女 19

2 王五 男 17

(2)获取列

print(df['姓名']) #获取“姓名”列的值

输出结果:

0 张三

1 李四

2 王五

Name: 姓名, dtype: object

另一种方法:

print(df[df.columns[0:1]]) #先按照索引号获取列名,再按照列名读取

输出结果和上面的方法完全一致。

还有一种情况,是获取唯一值,即将列内的重复值中多余的删除,仅留下互不相同的值。所用的到方法是unique()。

sex1=Series(df['性别'].unique())

print(sex1)

输出结果:

0 男

1 女

dtype: object

(3)获取指定位置的值

print(df.at[1,'姓名']) # 格式为变量名.at[行号,列名]

输出结果:

李四

(4)获取块的值

print(df.iloc[0:2,1:3]) # 格式为变量名.iloc[行号1:行号2, 列号1:列号2]

输出结果:

性别 年龄

0 男 18

1 女 19

print(df.iloc[:,1:2]) #获取“性别”列的值

运行结果:

性别

0 男

1 女

2 男

2、修改、删除、增加行和列

(1)修改列名

print(df.columns)

df.columns=['name','sex','age']

print(df.columns)

输出结果:

Index(['姓名', '性别', '年龄'], dtype='object')

Index(['name', 'sex', 'age'], dtype='object')

可见,列名已经由“姓名、性别、年龄”修改为“age、sex、age”了。但这种修改必须把全部列名都一一列举,不能有遗漏,否则就会出错。如:

df.columns=['name','sex']

此时会报错:ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements。

(2)修改行索引

df.index=[1,2,3]

(3)删除行

df.drop(1,axis=0) # axis=0表示行轴,也可以省略

(4)删除列

df.drop(‘性别’,axis=1) # axis=0表示列轴

也可以使用另一种方法:

del df['性别']

(5)增加列

df['电话']=['1111111','2222222','3333333']

print(df)

运行结果:

姓名 性别 年龄 电话

0 张三 男 18 1111111

1 李四 女 19 2222222

2 王五 男 17 3333333

(6)增加行

df.loc[len(df)]=['孙六','男','20']

(7)追加

from pandas import Series

from pandas import DataFrame

name=Series(['张三','李四','王五'])

sex=Series(['男','女','男'])

age=Series([18,19,17])

df=DataFrame({'姓名':name,'性别':sex,'年龄':age}) # 建立DataFrame,变量名为df

name1=Series(['孙六','候七'])

sex1=Series(['男','女'])

age1=Series([19,17])

df1=DataFrame({'姓名':name1,'性别':sex1,'年龄':age1})

# 建立DataFrame,变量名为df1

df=df.append(df1,ignore_index=True)

# 将对df1追加到df后面,参数ignore_index=True表示重新索引

print(df)

运行结果:

姓名 性别 年龄

0 张三 男 18

1 李四 女 19

2 王五 男 17

3 孙六 男 19

4 候七 女 17


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11552009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存