0x00 创建文件
import pandas as pd
"""
常用数据类型:cvs、txt、excel、sql
"""
#Excel的路径
pwd = r"pd001.xlsx"
#新建Excel,在工作表里去写,键名是行,键值是列
file = pd.DataFrame({'序号':[1,2,3],'姓名':['甲','已','丙']})
#设置索引列,不设置这行会多出一行
file = file.set_index('序号')
#保存
file.to_excel(pwd)
#打印成功通知
print('pp is smart!')
0x01 读取txt文件并另存CSV
import pandas as pd
#read_csv用逗号做分隔符
#read_table默认用\t做分隔符
pwd = "ceshi.txt"
#读数据。如选read_table 要指定分隔符:pd.read_table(pwd,sep=',')
#没表头加参数:header,添加表头名:names,他们俩要配合使用
#指定索引列:index_col,可以用列表设置多个索引
#跳过某些行:skiprows,可以用列表跳过多个行
#指定最多读取几行:nrows=6
data = pd.read_csv(pwd,header=None,names=['姓名','性别','电话号'],encoding='utf-8',nrows=6,index_col='姓名')
# print(data)
"""
如果想读取前五行数据:print(data.head(5))
查看数据结构是几行几列,有一行数据是表头:print(data.shape)
显示列名:print(data.columns)
查看每一列的数据类型:print(data.dtypes)
"""
#保存为CSV文件。
data.to_csv('ceshi2.csv')
0x02 连接并读取SQL文件
import pymysql
import pandas as pd
#显示所有列
pd.set_option('display.max_columns', None)
#显示所有行
pd.set_option('display.max_rows', None)
#调用connect()函数生产连接对象
connect = pymysql.connect(host='localhost',user='root',password='root',database='ctf_test_1',charset='utf8')
readfile = pd.read_sql('select * from users',con=connect)
print(readfile)
0x03 读取并修改Excel文件
import pandas as pd
#需要安装xlrd模块,否则会报错
pwd = '测试.xls'
#给Excel添加表头,设置索引列为“姓名”
file = pd.read_excel(pwd,header=None,names=['姓名','性别','年龄'],index_col='姓名')
#保存Excel,覆盖原文件
file.to_excel(pwd)
0x04 数据结构之Series
import pandas as pd
"""
[*]DataFrame:二维数据。整个表格,多行多列,简称df。
[*]Series:一维数据。比如一行或一列。
[*]二维数据是由多个Series组成的。
"""
#这里“S”一定是大写的!
data = pd.Series(['多多','赞多','Santa','宇野赞多'])
print(data)
"""
效果:
0 多多
1 赞多
2 Santa
3 宇野赞多
dtype: object
"""
#查看值:print(data.values)
#index:指定索引
data2 = pd.Series(['多多','赞多','Santa','宇野赞多'],index=['我是1','我是2','我是3','我是4'])
print(data2)
"""
效果:
我是1 多多
我是2 赞多
我是3 Santa
我是4 宇野赞多
"""
import pandas as pd
dic = {'姓名':'Santa','性别':'男','年龄':'23','地址':'不告诉你'}
#凡是以字典生成的Series,键名是索引列
data = pd.Series(dic)
print(data)
"""
效果:
姓名 Santa
性别 男
年龄 23
地址 不告诉你
dtype: object
"""
#通过键名查找键值:print(data['地址'])
#查找多个键名对应的键值:print(data[['姓名','地址']])
import pandas as pd
list1 = ['姓名','性别','年龄']
list2 = ['ShawRoot','Female','22']
#两个列表,指定list1为索引
data = pd.Series(list2,index=list1)
print(data)
import pandas as pd
#读取打乱顺序的Excel并排序
excel = pd.read_excel('测试.xls',index_col='序号')
"""
性别 姓名 年龄
序号
1 女 张三 13
3 男 李四 15
2 女 王武 55
"""
#按索引序号排序
print(excel.sort_index())
"""
性别 姓名 年龄
序号
1 女 张三 13
2 女 王武 55
3 男 李四 15
"""
#按年龄排序
print(excel.sort_values('年龄'))
#查看是否为空,为空显示Ture
print(excel.isnull())
"""
性别 姓名 年龄
序号
1 False False False
3 False False False
2 False False False
"""
#查看是否不为空,不为空显示True
print(excel.notnull())
0x05 数据结构之DataFrame
import pandas as pd
"""
[*]DataFrame是一个表格型的数据结构
[*]既有行索引index,也有列索引columns
[*]可以被看作由Series组成的字典
"""
#创建一个3行3列的数据
data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['a','b','c'])
print(data)
"""
效果:
a b c
0 1 2 3
1 4 5 6
2 7 8 9
"""
#查看a列0行的数是多少:print(data['a'][0])
#查看0行a列的数是多少:print(data.loc[0]['a'])
#查看第0行第0列的数是多少:print(data.iloc[0][0])
#查询多列数据,提供列名即可:print(data[['a','b']])
import pandas as pd
#使用字典创建3行3列的表
dic = {
'姓名':['张三','李四','王武'],
'年龄':[19,13,23],
'兴趣':['冲浪','养猫','画画']
}
data = pd.DataFrame(dic)
print(data)
"""
效果:
姓名 年龄 兴趣
0 张三 19 冲浪
1 李四 13 养猫
2 王武 23 画画
"""
#查看每列的数据类型:print(data.dtypes)
#查看所有列名:print(data.columns)
#查询一列Servies:print(data['姓名'])
#查询一条数据
print(data.loc[1])
"""
效果:
姓名 李四
年龄 13
兴趣 养猫
Name: 1, dtype: object
"""
#查询多行数据
print(data.loc[0:1])
"""
效果:
姓名 年龄 兴趣
0 张三 19 冲浪
1 李四 13 养猫
"""
import pandas as pd
#三个一维数组创建一个表
list1 = pd.Series(['Lily','Tom','Mary'],index=[1,2,3],name='Name')
list2 = pd.Series(['female','male','female'],index=[1,2,3],name='Sex')
list3 = pd.Series(['Teacher','Doctor','Archer'],index=[1,2,3],name='Job')
form = pd.DataFrame({list1.name:list1,list2.name:list2,list3.name:list3})
print(form)
"""
Name Sex Job
1 Lily female Teacher
2 Tom male Doctor
3 Mary female Archer
"""
form2 = pd.DataFrame([list1,list2,list3])
print(form2)
"""
1 2 3
Name Lily Tom Mary
Sex female male female
Job Teacher Doctor Archer
"""
#查看前五行:from.head(5)
#查看后三行:form.tail(3)
#查看数值:form.values
#查看行数、列数:form.shape
#将空值填充为0:form.fillna(0)
#将”男“替换成”女“:form.replace('男','女')
#查看唯一值:form.unique()
#删除原有索引:form.reset_index(drop=True)
#索引被还原成普通列:form.reset_index(drop=False)
#值排序:form.sort_values()
#查看数据的列名:form.columns
0x06 连接查询之Merge
import pandas as pd
import numpy as np
"""
内连接:两个表之间相交的部分。
左连接:左边有,右边表和左边表有重合部分的地方。
右连接:右边有,左边表和右边表有重合部分的地方。
全外连接:两个表都有,像两个表合并。
Marge默认是内连接。
"""
#np.arange(6):利用numpy生成的0到5的数字
list1 = pd.DataFrame({'姓名':['小明','小李','小红','小钢','小白','小绿'],'金钱数1':np.arange(6)})
"""
print(list1)
姓名 金钱数1
0 小明 0
1 小李 1
2 小红 2
3 小钢 3
4 小白 4
5 小绿 5
"""
list2 = pd.DataFrame({'姓名':['小明','小紫','小蓝'],'金钱数2':[4,3,2]})
"""
print(list2)
姓名 金钱数2
0 小明 4
1 小紫 3
2 小蓝 2
"""
#指定是内连接:how='inner'
#指定是左连接:how='left'
#指定是右连接:how='right'
#指定是全外连接:how='outer'
list3 = pd.merge(list1,list2,how='outer')
print(list3)
"""
姓名 金钱数1 金钱数2
0 小明 0.0 4.0
1 小李 1.0 NaN
2 小红 2.0 NaN
3 小钢 3.0 NaN
4 小白 4.0 NaN
5 小绿 5.0 NaN
6 小紫 NaN 3.0
7 小蓝 NaN 2.0
"""
import pandas as pd
import numpy as np
list1 = pd.DataFrame({'姓名':['Santa','Santa','Riki'],'班级':['1班','2班','1班'],'分数':[100,100,95]})
list2 = pd.DataFrame({'姓名':['Santa','Santa','Riki','Riki'],'班级':['1班','2班','1班','2班'],'分数':[99,97,90,98]})
"""
print(list1)
print('*'*30)
print(list2)
姓名 班级 分数
0 Santa 1班 100
1 Santa 2班 100
2 Riki 1班 95
******************************
姓名 班级 分数
0 Santa 1班 99
1 Santa 2班 97
2 Riki 1班 90
3 Riki 2班 98
"""
#默认内连接,取交集,on是指定用来对其的列名,how参数指定连接方式
list3 = pd.merge(list1,list2,on=['班级','姓名'],how='outer')
print(list3)
"""
姓名 班级 分数_x 分数_y
0 Santa 1班 100.0 99
1 Santa 2班 100.0 97
2 Riki 1班 95.0 90
3 Riki 2班 NaN 98
"""
import pandas as pd
import numpy as np
#索引列不同,表单合并的情况:
list1 = pd.DataFrame({'姓名':['张三','李四','王武'],'次数':range(3)})
list2 = pd.DataFrame({'数据':[10,20]},index=['张三','王武'])
"""
print(list1)
print('*'*30)
print(list2)
姓名 次数
0 张三 0
1 李四 1
2 王武 2
******************************
数据
张三 10
王武 20
"""
#以左表的“姓名”列进行内连接,连接右表的索引列,right_index默认为False
#不写how参数默认内连接!!!!
list3 = pd.merge(list1,list2,left_on='姓名',right_index=True)
print(list3)
"""
姓名 次数 数据
0 张三 0 10
2 王武 2 20
"""
0x07 连接查询之join与Merge总结
import pandas as pd
left_dic = pd.DataFrame({'姓名1':['小明','小红','小李'],'年龄1':[22,17,19]})
right_dic = pd.DataFrame({'姓名2':['大明','大红','大李'],'年龄2':[32,27,29]})
#两个表的列名不能有重复的
#用左边的表去连接右边的表,join方法默认左外连接how=left
#join方法的意义与merge基本相同
print(left_dic.join(right_dic))
"""
姓名1 年龄1 姓名2 年龄2
0 小明 22 大明 32
1 小红 17 大红 27
2 小李 19 大李 29
"""
#如果想一次连接多个表:result = left_dic.join([right1_dic,right2_dic,right3.dic])
0x08 连接查询之concat
import numpy as np
#np.arange(9):0到8
#reshape((3,3)):形状:3*3
arr = np.arange(9).reshape((3,3))
print(arr)
"""
[[0 1 2]
[3 4 5]
[6 7 8]]
"""
#合并数组
#axis=1:2D数组,横着的列是0轴,竖着的列是1轴。
arr1 = np.concatenate([arr,arr],axis=1)
print(arr1)
"""
[[0 1 2 0 1 2]
[3 4 5 3 4 5]
[6 7 8 6 7 8]]
"""
arr2 = np.concatenate([arr,arr],axis=0)
print(arr2)
"""
[[0 1 2]
[3 4 5]
[6 7 8]
[0 1 2]
[3 4 5]
[6 7 8]]
"""
import pandas as pd
list1 = pd.Series([0,1,2],index=['A','B','C'])
list2 = pd.Series([3,4],index=['D','E'])
list3 = pd.concat([list1,list2])
print(list3)
#默认是首位连接,axis=0
"""
A 0
B 1
C 2
D 3
E 4
dtype: int64
"""
#横向表拼接(会剃掉索引重复项):axis=1
list4 = pd.concat([list1,list2],axis=1)
print(list4)
"""
0 1
A 0.0 NaN
B 1.0 NaN
C 2.0 NaN
D NaN 3.0
E NaN 4.0
[*]sort:sort=Ture是默认的,pandas总是默认index排序
[*]key:要在相接的时候加上一个层次key来识别数据源于哪张表,可以增加key参数
[*]join:加上join参数的属性,如果为'inner'得到的是两个表的交集,如果是outer,得到的是两个表的并集
[*]join_axes:如果有join_axes参数传入,可以指定根据哪个轴来对齐数据
"""
0x09 连接查询之append
import pandas as pd
#append是series和dataframe的方法。
#使用它就是默认沿着列进行拼接(axis=0)
list1 = pd.Series([1,2,3],index=['A','B','C'])
list2 = pd.Series([4,5],index=['A','E'])
result = list1.append(list2)
print(result)
"""
A 1
B 2
C 3
A 4
E 5
dtype: int64
"""
import pandas as pd
#append可以将series和字典数据作为dataframe的新一行插入
list1 = pd.Series([1,2,3],index=['A','B','C'])
print(list1)
"""
A 1
B 2
C 3
dtype: int64
"""
list2 = pd.DataFrame({'A':['A0','A1','A2'],'B':['B0','B1','B2'],'C':['C0','C1','C2']})
print(list2)
"""
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
"""
#ingone_index:忽略原来的索引
result = list2.append(list1,ignore_index=True)
print(result)
"""
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
3 1 2 3
"""
0x0A 各种数据自动填充
import pandas as pd
import datetime as dt
pwd = "测试.xlsx"
file = pd.read_excel(pwd)
print(file)
"""
Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4 Unnamed: 5
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN 序号 姓名 性别 日期
2 NaN NaN NaN 张三 NaN NaN
3 NaN NaN NaN 李四 NaN NaN
4 NaN NaN NaN 王五 NaN NaN
"""
#使用skiprows跳过空行,usecols指定列号,dtype指定列内容的类型
file2 = pd.read_excel(pwd,skiprows=2,usecols='c:f',dtype={'序号':str,'性别':str,'日期':str})
print(file2)
"""
序号 姓名 性别 日期
0 NaN 张三 NaN NaN
1 NaN 李四 NaN NaN
2 NaN 王五 NaN NaN
"""
#获取第0行,第a列的值:变量名=数据.at[0,'a']
#做自动填充不能设置成整型,会报错
#datetime.date:表示日期,常用的属性有year、month和day
#datetime.timedelta:表示两个date、time、datetime实例之间的时间间隔,分辨率(最小单位)可达到微秒
#建立起始日期
when = dt.date(2021,3,21)
for i in file2.index:
file2['序号'].at[i] = i+1
file2['性别'].at[i] = '男' if i%2 == 0 else '女'
#file2['日期'].at[i] = when+dt.timedelta(days=i)
file2['日期'].at[i] = dt.date(when.year+i,when.month,when.day+i)
print(file2)
"""
序号 姓名 性别 日期
0 1 张三 男 2021-03-21
1 2 李四 女 2022-03-22
2 3 王五 男 2023-03-23
"""
file2.set_index('序号',inplace=True)
print(file2)
"""
姓名 性别 日期
序号
1 张三 男 2021-03-21
2 李四 女 2022-03-22
3 王五 男 2023-03-23
"""
0x0B 列与列之间的计算
import pandas as pd
pwd = "测试.xlsx"
#使用index_col指定索引
file = pd.read_excel(pwd,index_col='序号')
"""
print(file)
商品名称 单价 销售数量 销售金额
序号
1 香蕉 5 20 NaN
2 苹果 6 15 NaN
3 鸭梨 3 18 NaN
"""
#表示某一列
file['销售金额'] = file['单价']*file['销售数量']
"""
print(file)
商品名称 单价 销售数量 销售金额
序号
1 香蕉 5 20 100
2 苹果 6 15 90
3 鸭梨 3 18 54
"""
import pandas as pd
pwd = "测试.xlsx"
#使用index_col指定索引
file = pd.read_excel(pwd,index_col='序号')
"""
print(file)
商品名称 单价 销售数量 销售金额
序号
1 香蕉 5 20 NaN
2 苹果 6 15 NaN
3 鸭梨 3 18 NaN
"""
#指定哪列哪行
for i in range(1,3):
file['销售金额'].at[i] = file['单价'].at[i]*file['销售数量'].at[i]
print(file)
"""
商品名称 单价 销售数量 销售金额
序号
1 香蕉 5 20 100.0
2 苹果 6 15 90.0
3 鸭梨 3 18 NaN
"""
import pandas as pd
pwd = "测试.xlsx"
#使用index_col指定索引
file = pd.read_excel(pwd,index_col='序号')
"""
print(file)
商品名称 单价 销售数量 销售金额
序号
1 香蕉 5 20 NaN
2 苹果 6 15 NaN
3 鸭梨 3 18 NaN
"""
def high(x):
return x+3
#单价每个都+3
file['单价'] = file['单价'].apply(high)
#或者直接这么写:file['单价'].apply(lambda x:x+3)
print(file)
"""
商品名称 单价 销售数量 销售金额
序号
1 香蕉 8 20 NaN
2 苹果 9 15 NaN
3 鸭梨 6 18 NaN
"""
import pandas as pd
import numpy as np
arr = [
[1,2,3],
[4,5,6],
[7,8,9]
]
data = pd.DataFrame(arr,columns=list('xyz'),index=list('abc'))
print(data)
"""
x y z
a 1 2 3
b 4 5 6
c 7 8 9
"""
#所有元素的平方
print(data.apply(np.square))
"""
x y z
a 1 4 9
b 16 25 36
c 49 64 81
"""
#仅对x列进行计算
print(data.apply(lambda m:np.square(m) if m.name == 'x' else m))
"""
x y z
a 1 2 3
b 16 5 6
c 49 8 9
"""
#对a,c行进行计算,改行标签axis=1
print(data.apply(lambda m:np.square(m) if m.name in ['a','c'] else m,axis=1))
"""
x y z
a 1 4 9
b 4 5 6
c 49 64 81
"""
0x0C 数据排序
import pandas as pd
pwd = "测试.xlsx"
file = pd.read_excel(pwd,index_col='序号')
print(file)
"""
姓名 语文 数学 英语
序号
2 张三 62 88 64
4 李四 55 44 63
6 王武 74 66 27
7 赵六 22 33 86
1 孙琪 63 88 46
3 周八 44 45 33
5 武九 38 90 75
"""
#对“语文”这一列进行排序
#by:对哪一列进行排序
#inplace:创不创建新对象,如果为True是不创建新对象
#ascending:False降序,True升序
file.sort_values(by='语文',inplace=True,ascending=False)
print(file)
"""
姓名 语文 数学 英语
序号
6 王武 74 66 27
1 孙琪 63 88 46
2 张三 62 88 64
4 李四 55 44 63
3 周八 44 45 33
5 武九 38 90 75
7 赵六 22 33 86
"""
#排序:语文降序,数学升序,英语降序
file.sort_values(by=['语文','数学','英语'],inplace=True,ascending=[False,True,False])
#按索引进行排序
file.sort_index(inplace=True)
print(file)
"""
姓名 语文 数学 英语
序号
1 孙琪 63 88 46
2 张三 62 88 64
3 周八 44 45 33
4 李四 55 44 63
5 武九 38 90 75
6 王武 74 66 27
7 赵六 22 33 86
"""
0x0D 数据查询
import pandas as pd
pwd = "测试.xlsx"
data = pd.read_excel(pwd,index_col='序号')
print(data)
"""
姓名 语文 数学 英语
序号
2 张三 62 88 64
4 李四 55 44 63
6 王武 74 66 27
7 赵六 22 33 86
1 孙琪 63 88 46
3 周八 44 45 33
5 武九 38 90 75
"""
#loc:查询指定索引的某列,例如序号为4的索引的语文列
print(data.loc[4,'语文'])
"""
55
"""
0x0E 数据筛选
import pandas as pd
pwd = "测试.xlsx"
#index_col:指定索引列是“序号”
#sheet_name:如果有多个表的情况下,指定某张表
data = pd.read_excel(pwd,index_col='序号',sheet_name='Sheet1')
data = data.sort_values('序号')
print(data)
"""
姓名 语文 数学 英语
序号
1 孙琪 63 88 46
2 张三 62 88 64
3 周八 44 45 33
4 李四 55 44 63
5 武九 38 90 75
6 王武 74 66 27
7 赵六 22 33 86
"""
#第二行到第四行
#注意:需要新定义一个变量再筛选
data2 = data.loc[2:4]
print(data2)
"""
姓名 语文 数学 英语
序号
2 张三 62 88 64
3 周八 44 45 33
4 李四 55 44 63
"""
#筛选语文、数学、英语都大于60分的人
choose = "语文 >= 60 and 数学 >= 60 and 英语 >= 60"
#只有loc函数用中括号,其它都用小括号
print(data.query(choose))
"""
姓名 语文 数学 英语
序号
2 张三 62 88 64
"""
#筛选周八和武九
choose2 = "姓名 in ['周八','武九']"
print(data.query(choose2))
"""
姓名 语文 数学 英语
序号
3 周八 44 45 33
5 武九 38 90 75
"""
#筛选姓名列开头姓张的
choose3 = data['姓名'].str.startswith('周')
print(data[choose3])
"""
姓名 语文 数学 英语
序号
3 周八 44 45 33
"""
#也可以用str.contains判定是否包含查找的字符串,这个略了,自己百度。
import pandas as pd
pwd = "筛选.xlsx"
#parse_dates:时间字符串转换成日期格式
data = pd.read_excel(pwd,index_col='出生日期',parse_dates=['出生日期'])
print(data)
"""
序号 姓名 性别
出生日期
1934-03-12 1 张三 男
1987-09-14 2 李四 女
1977-09-09 3 王武 女
2000-07-11 4 赵六 男
2004-06-07 5 孙琪 男
1999-05-15 6 周八 男
1998-03-21 7 武九 女
"""
#筛选前五行的,索引包括“2000”关键字的行
print(data['2000'].head())
"""
序号 姓名 性别
出生日期
2000-07-11 4 赵六 男
"""
#truncate()函数可以截取某个时期之前或之后的数据,
#筛选1999年到2000年出生的人
#如果需要使用truncate()函数,必须把数据先进行排序
data = data.sort_index()
print(data.truncate(before='1999-01-01',after='2000-12-12'))
"""
序号 姓名 性别
出生日期
1999-05-15 6 周八 男
2000-07-11 4 赵六 男
"""
#也可以这么写
print(data['1999-01':'2004-12'])
"""
序号 姓名 性别
出生日期
1999-05-15 6 周八 男
2000-07-11 4 赵六 男
2004-06-07 5 孙琪 男
"""
#如果条件太多了,可以写成括号形式
#需要把序号设置成索引或默认索引
data2 = pd.read_excel(pwd,index_col='序号',parse_dates=['出生日期'])
data2 = data2.sort_values('出生日期')
choose = (
'@data2.出生日期.dt.year > 1980 and'
'@data2.出生日期.dt.year < 2000'
'and 性别 == "女"'
)
print(data2.query(choose))
"""
姓名 性别 出生日期
序号
2 李四 女 1987-09-14
7 武九 女 1998-03-21
"""
0x0E 数据删除
import pandas as pd
pwd = "筛选.xlsx"
data = pd.read_excel(pwd,index_col='序号')
print(data)
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
2 李四 女 1987-09-14
3 王武 女 1977-09-09
4 赵六 男 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 女 1998-03-21
"""
#删除数据第二行
print(data.drop(2))
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
3 王武 女 1977-09-09
4 赵六 男 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 女 1998-03-21
"""
#删除多行
print(data.drop(labels=[1,3]))
"""
姓名 性别 出生日期
序号
2 李四 女 1987-09-14
4 赵六 男 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 女 1998-03-21
"""
#删除”性别“列
print(data.drop('性别',axis=1))
"""
姓名 出生日期
序号
1 张三 1934-03-12
2 李四 1987-09-14
3 王武 1977-09-09
4 赵六 2000-07-11
5 孙琪 2004-06-07
6 周八 1999-05-15
7 武九 1998-03-21
"""
0x0F 处理缺失值
import pandas as pd
#空值就是缺失值,但缺失值不仅仅是空值
pwd = "筛选.xlsx"
data = pd.read_excel(pwd,index_col='序号')
print(data)
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
2 李四 NaN 1987-09-14
3 王武 女 1977-09-09
4 赵六 NaN 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 NaN 1998-03-21
"""
#data.isnull():判断是否是空值,是空值为True
#data.notnull():判断是否是空值,不是空值为True
#默认有空值的行都会被删掉
print(data.dropna())
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
3 王武 女 1977-09-09
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
"""
#axis=0 删除包含缺失值的行
#axis=1 删除包含缺失值的列
print(data.dropna(axis=1))
"""
姓名 出生日期
序号
1 张三 1934-03-12
2 李四 1987-09-14
3 王武 1977-09-09
4 赵六 2000-07-11
5 孙琪 2004-06-07
6 周八 1999-05-15
7 武九 1998-03-21
"""
#how='any' 只要有缺失值出现,就删除该行或列
#how='all' 所有的值都缺失,才删除行或列
#axis=0,thresh=10:如果该行中非缺失值的数量小于10,将删除这一行
#inplace:是否在原数据上操作
#指定某列进行操作
print(data.dropna(subset=['姓名']))
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
2 李四 NaN 1987-09-14
3 王武 女 1977-09-09
4 赵六 NaN 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 NaN 1998-03-21
"""
import pandas as pd
#空值就是缺失值,但缺失值不仅仅是空值
pwd = "筛选.xlsx"
data = pd.read_excel(pwd,index_col='序号')
print(data)
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
2 李四 NaN 1987-09-14
3 王武 女 1977-09-09
4 赵六 NaN 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 NaN 1998-03-21
"""
#缺失值填充
print(data.fillna('未知'))
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
2 李四 未知 1987-09-14
3 王武 女 1977-09-09
4 赵六 未知 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 未知 1998-03-21
"""
#'性别'列的空值填充成“女”,姓名列的空值填充成’匿名‘
print(data.fillna({'性别':'女','姓名':'匿名'}))
"""
姓名 性别 出生日期
序号
1 张三 男 1934-03-12
2 李四 女 1987-09-14
3 王武 女 1977-09-09
4 赵六 女 2000-07-11
5 孙琪 男 2004-06-07
6 周八 男 1999-05-15
7 武九 女 1998-03-21
"""
# print(data.fillna(method='ffill'))
"""
ffill:用前面的值进行填充
bfill:用后面的值进行填充
"""
0x10 数学统计函数
import pandas as pd
pwd = '数据统计.xlsx'
data = pd.read_excel(pwd,index_col='序号')
print(data)
"""
姓名 性别 语文 数学 英语
序号
1 小赵 男 89 37 69
2 小刘 女 45 66 53
3 小李 男 65 59 77
4 小皮 男 35 86 95
5 小花 女 77 93 58
6 小芳 女 85 44 57
"""
print(data.describe())
#count:这一列里有多少值
#mean:均值
#std:标准差
"""
语文 数学 英语
count 6.00000 6.000000 6.000000
mean 66.00000 64.166667 68.166667
std 21.97271 22.283776 15.854547
min 35.00000 37.000000 53.000000
25% 50.00000 47.750000 57.250000
50% 71.00000 62.500000 63.500000
75% 83.00000 81.000000 75.000000
max 89.00000 93.000000 95.000000
"""
print(data['语文'].describe())
"""
count 6.00000
mean 66.00000
std 21.97271
min 35.00000
25% 50.00000
50% 71.00000
75% 83.00000
max 89.00000
Name: 语文, dtype: float64
"""
#查看'语文'列的均值
print(data['语文'].mean())
"""
66.0
"""
0x11 删除重复和提取重复
import pandas as pd
pwd = '数据统计.xlsx'
data = pd.read_excel(pwd,index_col='序号')
print(data)
"""
姓名 性别 分数
序号
1 小明 男 80
2 小明 男 99
3 小猫咪 女 57
4 小猫咪 女 88
5 小狗勾 男 75
6 丸子 男 48
7 丸子 男 97
8 皮卡丘 女 76
"""
print(data['姓名'].value_counts())
"""
小明 2
小猫咪 2
丸子 2
皮卡丘 1
小狗勾 1
Name: 姓名, dtype: int64
"""
#keep:默认first保留第一次出现的值,last保留最后一次出现的值,False删除所有重复值,留下没有出现过的重复值
print(data.drop_duplicates(subset=['姓名'],keep='first'))
"""
姓名 性别 分数
序号
1 小明 男 80
3 小猫咪 女 57
5 小狗勾 男 75
6 丸子 男 48
8 皮卡丘 女 76
"""
print(data.drop_duplicates(subset=['姓名'],keep=False))
"""
姓名 性别 分数
序号
5 小狗勾 男 75
8 皮卡丘 女 76
"""
#判断哪行是重复的
cf = data.duplicated(subset='姓名')
#显示重复的
print(data[cf])
"""
姓名 性别 分数
序号
2 小明 男 99
4 小猫咪 女 88
7 丸子 男 97
"""