总结自己经常使用的pandas操作技巧:
import pandas as pd
import numpy as np
方式1:自己直接创建
df1 = pd.DataFrame({
"name":["小明","小红","小孙","王小","关宇","刘蓓","张菲"],
"age":[20,18,27,20,28,18,25],
"sex":["男","女","男","男","男","女","女"],
"score":[669,570,642,590,601,619,701],
"address":["北京","深圳","广州","武汉","深圳","广州","长沙"]
})
df1
数据如下图:
方式2:从本地文件中读取进来。现在本地有一个文件:学生信息.xlsx
直接通过pd.read_excel()
读进来:
df2 = pd.read_excel("学生信息.xlsx")
df2
可以看到效果和上面是一样的
shape表示数据是由多少行和列组成:
df1.shape # (7,5)
df1.columns
df1.dtypes
可以看到只有两种数据类型:int64和object
df1.isnull() # 如果缺失显示为True,否则显示False
df1.isnull().sum() # 统计缺失值的个数。一个True计数一次
结果显示:本次数据是没有缺失值的
df1.index
df1.describe
统计值信息只会显示类型为数值型的数据统计值信息:
df1.describe()
统计值的结果包含:个数count、均值mean、方差std、最值min\max、四分位数25%、中位数50%、四分之三分位数75%。
通过head和tail方法能够快速查看数据的头尾文件。
df1.head() # 默认是查看前5行数据
df1.head(3) # 指定显示的行数
df1.tail() # 默认尾部5行
df1.tail(3) # 指定尾部3行数据
从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 age
0 小明 20
1 小红 18
2 小孙 27
3 王小 20
4 关宇 28
5 刘蓓 18
6 张菲 25
比如,我们想选择字段类型为int64的数据,通过查看的字段数据类型显示:age和score都是int64类型
1、选择单个数据类型
# 1、选择单个数据类型
df1.select_dtypes(include='int64')
# 结果
age score
0 20 669
1 18 570
2 27 642
3 20 590
4 28 601
5 18 619
6 25 701
2、同时选择多个类型
df1.select_dtypes(include=['int64','object'])
# 结果
name age sex score address
0 小明 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 address
0 小明 男 北京
1 小红 女 深圳
2 小孙 男 广州
3 王小 男 武汉
4 关宇 男 深圳
5 刘蓓 女 广州
6 张菲 女 长沙
1、直接通过判断大小来取数:
df1[df1["age"] == 20] # 年龄等于20
df1[df1["age"] != 20] # 年龄不等于20
df1[df1["age"] >= 20] # 年龄大于等于20
2、多个判断条件连用
第一次使用上面的方法报错:关键词是ambiguous
。判断条件很让pandas混淆,改成下面的写法成功解决:
df1[(df1["age"] >= 20) & (df1["age"] < 27)]
1、通过单个条件取数
# 1、单条数据
df1[df1["name"] == "小明"]
# 结果
name age sex score address
0 小明 20 男 669 北京
2、通过多个条件取数
选择姓名是小明,或者年龄大于25的数据
df1[(df1["name"] == "小明") | (df1["age"] > 25)]
# 结果
name age sex score address
0 小明 20 男 669 北京
2 小孙 27 男 642 广州
4 关宇 28 男 601 深圳
3、字符串的开始、结尾、包含函数
# 1、取出以“小”开头的姓名
df1[df1["name"].str.startswith("小")] # name以"小"开头
# 结果
name age sex score address
0 小明 20 男 669 北京
1 小红 18 女 570 深圳
2 小孙 27 男 642 广州
# 以“关”开始
df1[df1["name"].str.startswith("关")]
# 结果
name age sex score address
4 关宇 28 男 601 深圳
# 3、以“菲”结尾
df1[df1["name"].str.endswith("菲")]
# 结果
name age sex score address
6 张菲 25 女 701 长沙
# 取出包含“小”的数据:不管小是在开头,还是结尾都会被选出来
df1[df1["name"].str.contains("小")]
# 结果
name age sex score address
0 小明 20 男 669 北京
1 小红 18 女 570 深圳
2 小孙 27 男 642 广州
3 王小 20 男 590 武汉
上面的王小
不是小开头,但是包含小,所以也被选出来。
4、字符串取反操作
取反符号是波浪线:~
下面的例子是:取出名字name中不包含小的数据,只有3个人名字中没有小字。
# 取出不包含小的数据
df1[~df1["name"].str.contains("小")]
# 结果
name age sex score address
4 关宇 28 男 601 深圳
5 刘蓓 18 女 619 广州
6 张菲 25 女 701 长沙
切片是Python中存在的概念,在pandas中同样可以使用。切片中存在3个概念:start、stop、step
写法为:[start:stop:step]
1、通过下面的3个案例说明:起始索引默认从0开始,步长默认是1
2、指定起始索引,不指定结束索引,表示一直取到数据末尾
df1[4:] # 从索引4开始取到末尾
# 结果
name age sex score address
4 关宇 28 男 601 深圳
5 刘蓓 18 女 619 广州
6 张菲 25 女 701 长沙
3、改变步长的值
df1[0:4:2] # 改变步长:每隔2个值取一行数据
# 结果
name age sex score address
0 小明 20 男 669 北京
2 小孙 27 男 642 广州
上面的例子不指定起始索引:
df1[:4:2] # 默认从0开始
4、只指定步长
df1[::2] # 从头到尾,步长为2
# 结果
name age sex score address
0 小明 20 男 669 北京
2 小孙 27 男 642 广州
4 关宇 28 男 601 深圳
6 张菲 25 女 701 长沙
1、步长为-1,默认是倒序输出结果
df1[::-1] # 倒序输出
# 结果
name age sex score address
6 张菲 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 address
4 关宇 28 男 601 深圳
3 王小 20 男 590 武汉
2 小孙 27 男 642 广州
1 小红 18 女 570 深圳
3、起始和终止索引为负数
df1[-1:-5:-1] # 最后一行记录索引为-1,不包含索引为-5的数据
name age sex score address
6 张菲 25 女 701 长沙
5 刘蓓 18 女 619 广州
4 关宇 28 男 601 深圳
3 王小 20 男 590 武汉