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
"""