Python其实很简单 第十九章 Pandas之Series与DataFrame

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python其实很简单 第十九章 Pandas之Series与DataFrame相关的知识,希望对你有一定的参考价值。

参考技术A

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

以上是关于Python其实很简单 第十九章 Pandas之Series与DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

python学习手册:第十九章——函数的高级话题

流畅python学习笔记:第十九章:动态属性和特性

WPF学习第十九章 控件类

第十九章枚举集合

第十九章 os模块

第十九章 文本处理流编辑器:awk编程