分享

入门Pandas不可不知的技巧

 copy_left 2021-05-01

大家好,我是Python之眼。

今天来跟大家分享 Pandas 的一些常用知识点,文章内容由公众号读者 Peter 创作。

如果你用 Python 做数据分析,必然会绕不过 Pandas 的使用,实际上, Python 也是由于 numpy、pandas 等数据科学库的出现,才开始在数据科学领域实现了快速的发展,因此,学好 Pandas 有很重要的现实意义。

本文总结自己经常使用的pandas操作方法:

  • 创建DataFrame数据
  • 查看数据相关信息
  • 查看头尾文件
  • 花样取数
  • 切片取数
  • 常见函数使用

首先,导入包

import pandas as pdimport numpy as np

01 创建DataFrame数据

方式1:通过字典直接创建

df1 = pd.DataFrame({    'name':['小明','小红','小孙','王小','关宇','刘蓓','张菲'],    'age':[20,18,27,20,28,18,25],    'sex':['男','女','男','男','男','女','女'],    'score':[669,570,642,590,601,619,701],    'address':['北京','深圳','广州','武汉','深圳','广州','长沙']})df1

数据如下图:

入门Pandas不可不知的技巧

方式2:通过本地数据读取

从本地文件中读取进来。现在本地有一个文件:学生信息.xlsx直接通过pd.read_excel()读进来:

df2 = pd.read_excel('学生信息.xlsx')df2
入门Pandas不可不知的技巧

可以看到效果和上面是一样的

02 数据探索

查看数据shape

shape表示数据是由多少行和列组成:

df1.shape  # (7,5)

查看字段属性名称

df1.columns
入门Pandas不可不知的技巧

查看属性的数据类型

df1.dtypes
入门Pandas不可不知的技巧

可以看到只有两种数据类型:int64和object

查看数据是否缺失

df1.isnull()   # 如果缺失显示为True,否则显示False
入门Pandas不可不知的技巧
df1.isnull().sum() # 统计缺失值的个数。一个True计数一次
入门Pandas不可不知的技巧

结果显示:本次数据是没有缺失值的

查看数据行索引

df1.index
入门Pandas不可不知的技巧

查看数据描述信息

df1.describe
入门Pandas不可不知的技巧

查看数据统计值

统计值信息只会显示类型为数值型的数据统计值信息:

df1.describe()
入门Pandas不可不知的技巧

统计值的结果包含:个数count、均值mean、方差std、最值min\max、四分位数25%、中位数50%、四分之三分位数75%。

03 查看头尾文件

通过head和tail方法能够快速查看数据的头尾文件。

head

df1.head()   # 默认是查看前5行数据df1.head(3)  # 指定显示的行数

tail

df1.tail()    # 默认尾部5行df1.tail(3)   # 指定尾部3行数据

04 花样取数

从pandas的DataFrame数据框中取出我们想要的数据,然后进行处理

取出某个字段的数据

我们取出name这列的数据:

name = df1['name']name# 结果0    小明1    小红2    小孙3    王小4    关宇5    刘蓓6    张菲Name: name, dtype: object

取出多个字段的数据

比如我们取出name和age列的数据:

name_age = df1[['name','age']]  name_age# 结果  name age0 小明 201 小红 182 小孙 273 王小 204 关宇 285 刘蓓 186 张菲 25

根据字段类型选择数据

比如,我们想选择字段类型为int64的数据,通过查看的字段数据类型显示:age和score都是int64类型

1、选择单个数据类型

# 1、选择单个数据类型df1.select_dtypes(include='int64')# 结果  age score0 20 6691 18 5702 27 6423 20 5904 28 6015 18 6196 25 701

2、同时选择多个类型

df1.select_dtypes(include=['int64','object'])# 结果  name  age sex score address0 小明  20   669    北京1 小红  18   570    深圳2 小孙  27   642    广州3 王小  20   590    武汉4 关宇  28   601    深圳5 刘蓓  18   619    广州6 张菲  25   701    长沙

因为数据中只有int64,object,所以我们全部选出来了。

3、选择排除某些数据类型之外的数据:

# 选择除了int64类型之外的数据# 排除name和score字段之外的数据df1.select_dtypes(exclude='int64') # 结果  name sex address0 小明 男   北京1 小红 女   深圳2 小孙 男   广州3 王小 男   武汉4 关宇 男   深圳5 刘蓓 女   广州6 张菲 女   长沙

根据数值大小取数

1、直接通过判断大小来取数:

df1[df1['age'] == 20]  # 年龄等于20df1[df1['age'] != 20]  # 年龄不等于20df1[df1['age'] >= 20]  # 年龄大于等于20

2、多个判断条件连用

入门Pandas不可不知的技巧

第一次使用上面的方法报错:关键词是ambiguous。判断条件很让pandas混淆,改成下面的写法成功解决:

df1[(df1['age'] >= 20) & (df1['age'] < 27)]
入门Pandas不可不知的技巧

根据字符串取数

1、通过单个条件取数

# 1、单条数据df1[df1['name'] == '小明']  # 结果  name  age sex  score address0 小明  20  男   669   北京

2、通过多个条件取数

选择姓名是小明,或者年龄大于25的数据

df1[(df1['name'] == '小明') | (df1['age'] > 25)]# 结果  name  age sex  score address0 小明  20    669   北京2 小孙  27    642   广州4 关宇  28    601   深圳

3、字符串的开始、结尾、包含函数

  • str.startswith(string)
  • str.endswith(string)
  • str.contains(string)
1、取出以“小”开头的姓名df1[df1['name'].str.startswith('小')]  # name以'小'开头# 结果 name  age sex  score address0 小明 20 男    669 北京1 小红 18 女    570 深圳2 小孙 27 男    642 广州
# 以“关”开始df1[df1['name'].str.startswith('关')]# 结果 name  age sex  score address4 关宇 28 男    601 深圳
# 3、以“菲”结尾df1[df1['name'].str.endswith('菲')]# 结果  name  age sex  score address6 张菲  25  女   701   长沙
# 取出包含“小”的数据:不管小是在开头,还是结尾都会被选出来df1[df1['name'].str.contains('小')]# 结果  name  age sex  score address0 小明  20  男  669  北京1 小红  18  女  570  深圳2 小孙  27  男  642  广州3 王小  20  男  590  武汉

上面的王小不是小开头,但是包含小,所以也被选出来。

4、字符串取反操作

取反符号是波浪线:~

下面的例子是:取出名字name中不包含小的数据,只有3个人名字中没有小字。

# 取出不包含小的数据df1[~df1['name'].str.contains('小')]# 结果  name  age sex  score address4 关宇  28  男  601   深圳5 刘蓓  18  女  619   广州6 张菲  25  女  701   长沙

05 切片取数

切片是Python中存在的概念,在pandas中同样可以使用。切片中存在3个概念:start、stop、step

  • start:起始索引,包含
  • stop:结束索引,不包含
  • step:步长,可正可负;

写法为:[start:stop:step]

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们一起学习,关注小编,并私信“01”即可领取python学习资料,会节约很多时间,减少很多遇到的难题。

步长为正数

1、通过下面的3个案例说明:起始索引默认从0开始,步长默认是1

入门Pandas不可不知的技巧
入门Pandas不可不知的技巧

2、指定起始索引,不指定结束索引,表示一直取到数据末尾

df1[4:]  # 从索引4开始取到末尾# 结果  name  age sex  score address4 关宇  28  男  601   深圳5 刘蓓  18  女  619   广州6 张菲  25  女  701   长沙

3、改变步长的值

df1[0:4:2]  # 改变步长:每隔2个值取一行数据# 结果  name  age sex  score address0 小明  20  男   669   北京2 小孙  27  男   642   广州

上面的例子不指定起始索引:

df1[:4:2]  # 默认从0开始

4、只指定步长

df1[::2]   # 从头到尾,步长为2# 结果  name  age sex  score address0 小明  20  男   669   北京2 小孙  27  男  642   广州4 关宇  28  男  601   深圳6 张菲  25  女  701   长沙

步长为负数

1、步长为-1,默认是倒序输出结果

df1[::-1]  # 倒序输出# 结果   name  age sex  score address6  张菲   25 女    701  长沙5  刘蓓   18 女    619  广州4  关宇   28 男    601  深圳3  王小   20 男    590  武汉2  小孙   27 男    642  广州1  小红   18 女    570  深圳0  小明   20 男    669  北京

2、步长为负,指定起始和终止索引,起始索引大于终止索引

df1[4:0:-1]  name  age sex  score address4 关宇  28     601   深圳3 王小  20     590   武汉2 小孙  27     642   广州1 小红  18     570   深圳

3、起始和终止索引为负数

df1[-1:-5:-1]  # 最后一行记录索引为-1,不包含索引为-5的数据 name  age sex  score address6 张菲 25 女    701  长沙5 刘蓓 18 女    619  广州4 关宇 28 男    601  深圳3 王小 20 男    590  武汉

06 常用函数

统计元素个数

很多时候我们需要统计某个列中每个元素出现的个数,相当于是做词频统计,使用:value_counts()方法,具体案例为:

⚠️:新数据中df1增加了一列:班级class,后续有作用

入门Pandas不可不知的技巧

比如我们想统计每个城市出现了多少次:

# 统计中每个城市各出现了多少次address = df1['address'].value_counts()address
入门Pandas不可不知的技巧

结果自动是降序排列的Series类型数据

索引重置

索引重置使用reset_index()

address_new = address.reset_index()address_new
入门Pandas不可不知的技巧

还比如我们想从数据中单独取出sex='男'的数据:

fale = df1[df1['sex'] == '男']fale
入门Pandas不可不知的技巧

我们观察到数据前面的索引还是原来的,但是我们希望的是从0开始显示,比较符合我们的习惯:

fale_1 = fale.reset_index()fale_1
入门Pandas不可不知的技巧

出现的结果中索引是我们想要的结果,但是出现了一列新的数据,就是原来的索引构成的数据,这不是我们想要的数据,需要去除:

fale_1 = fale.reset_index(drop=True)  # 加上参数即可解决fale_1
入门Pandas不可不知的技巧

属性重命名

使用的是rename函数,传入columsn参数:

address_new = address_new.rename(columns={'index':'address',                                         'address':'number'                                        })address_new
入门Pandas不可不知的技巧

groupby使用

groupby主要是实现分组统计的功能:

1、比如我们想统计男女各自的总分

入门Pandas不可不知的技巧
# 统计男女的总成绩:sumsex_score = df1.groupby('sex')['score'].sum()sex_score
入门Pandas不可不知的技巧

2、求男女各自的平均分mean

# 统计男女的平均成绩:meansex_score = df1.groupby('sex')['score'].mean()sex_score
入门Pandas不可不知的技巧

3、根据男女性别sex、班级class求总分

# 先根据性别、班级求总分sex_class = df1.groupby(['sex','class'])['score'].sum()sex_class
入门Pandas不可不知的技巧

一行代码实现上面的功能

# 一行代码实现df1.groupby(['sex','class'])['score'].sum().reset_index()
入门Pandas不可不知的技巧

apply函数

还是上面的df1数据集:

入门Pandas不可不知的技巧

1、需求1:我们想将性别中的男变成1,女变成0

# 1、改变:男-1,女-0df2 = df1.copy()  # 生成一个副本df2['sex'] = df2['sex'].apply(lambda x: 1 if x=='男' else 0)  # 通过匿名函数解决df2
入门Pandas不可不知的技巧

我们还可以自定义一个函数来实现:

#  自定义函数def apply_sex(x):    return 1 if x == '男' else 0df3 = df1.copy()  # 生成一个副本df3df3['sex'] = df3['sex'].apply(apply_sex)  # 通过自定义函数解决df3
入门Pandas不可不知的技巧

2、还比如我们想给每个城市的后面加上一个“市”,变成北京市、深圳市等:

# 2、给每个城市加上一个字:市,变成北京市、深圳市等df4 = df1.copy()df4['address'] = df4['address'].apply(lambda x: x + '市')df4
入门Pandas不可不知的技巧

总结

本文中从pandas中DataFrame数据的创建,常见数据信息的探索,再到如何从数据框中获取到我们指定的数据,最后介绍了笔者常用的处理数据的方法,希望对入门或者对不熟悉pandas的朋友有所帮助。Pandas真的是十分强大,学好之后会大大节省我们处理数据的时间。

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多