Python[统计案例分析/课程内容+补充]

亿点简单的代码

最基本的入门知识

  1. Number(数值型)
  2. String(字符串型)
  3. List(列表)
  4. Tuple(元组)
  5. Set(集合)
  6. Dictionary(字典)

Number(数值型)

Python3 支持 int、float、bool(布尔值)、complex(复数)

一些简单的基础操作(必须掌握)
  1. 赋值
  2. 查看数据类型——type( )
  3. 删除一些对象引用——del( )
  4. 数值运算操作
  5. 除数和余数的结合——divod( )
#赋值
a=20
a

a,b=20,30
print(a,b)

a, b, c, d = 20, 5.5, True, 4+3j
print(a,b,c,d)

#内置的 type() 函数可以用来查询变量所指的对象类型
print(type(a), type(b), type(c), type(d))

#使用del语句删除一些对象引用
del a

#数值运算
5 + 4  # 加法
4.3 - 2 # 减法
3 * 7  # 乘法

数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数

2 / 4  # 除法,得到一个浮点数
2 // 4 # 除法,得到一个整数

17 % 3 # 取余
2 ** 5 # 乘方

divmod() 函数——把除数和余数运算结果结合起来

#divmod() 函数把除数和余数运算结果结合起来
#函数语法:divmod(a, b)
divmod(7,2)
##Output[]:(3, 1)

在混合计算时,Python会把整型转换成为浮点数。

String(字符型)

Python中的字符串用单引号 ' ' 或双引号 " " 括起来

m="abc"
m

m,n="abc","def"
print(m,n)

#连接字符串,输出结果👉abcdef
m+n

同时使用反斜杠\n 转义特殊字符
\n: 换行

#转义符号/n
string="Ru\noob"
print(string)
##Output
Ru
oob

如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串

print(r'Ru\noob')
##Output
Ru\noob

[亿点补充]转义字符

转义字符

字符串截取

截取的语法格式(Python在各个数据类型的截取方法一致)如下:

字符串/列表元素/元组元素Runoob
反向截取-6-5-4-3-2-1
正向截取012345

截取字符串采取左闭右开原则,因此如果想要截取到第i个字符,则右端点应该是i+1
如果选取最后一个,则右端点为:

左端点也可以输入:,表示从第一个开始截取。

str = 'Runoob'
print (str)          # 输出字符串
print (str[0:-1])    # 输出第一个到倒数第二个的所有字符
print (str[0])       # 输出字符串第一个字符
print (str[2:5])     # 输出从第三个开始到第五个的字符
print (str[2:])      # 输出从第三个开始的后的所有字符
##Output
Runoob
Runoo
R
noo
noob

加号 + 是字符串的连接符, 星号 * 表示复制当前字符串,紧跟的数字为复制的次数

print (str * 2)      # 输出字符串两次
print (str + "TEST") # 连接字符串
##Output
RunoobRunoob
RunoobTEST

Python中的字符串不能改变

List(列表)

列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)

tinylist = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
列表的截取和连接

list[a:b:c]: list可以接受第3个参数,第三个参数的意义是步长

list = [123,'runoob'] 
print (list) # 输出完整列表 
print (list[0]) # 输出列表第一个元素 
print (list[1:3]) # 从第二个开始输出到第三个元素 

#从第一个元素到第四个元素,步长为2(就是一个隔一个取数字)
#list[a:b:c] list可以接受第三个参数,第三个参数的意义是步长
print(tinylist[0:4:2])

print (list[2:]) # 输出从第三个元素开始的所有元素 
print (list * 2) # 输出两次列表 
print (list + tinylist) # 连接列表
改变列表的元素
a = [1, 2, 3, 4, 5, 6]
a[0] = 9 #将列表a中的第一个元素 1 改为 9

a[2:5] = [13, 14, 15] #将列表a中第三个到第五个数据依次改为 13,14,15

a[2:6] = [] # 将对应的元素值设为空值,不是设为 0, 是直接删除掉这些个数据
[亿点补充] append()、pop()函数

List 内置了有很多方法,例如 append()、pop() 等等

关于Python中[]()的运用

[]: 提取dataframe中的变量时,

  • 有变量名则表格名称[" 变量名 "]
  • 无变量名则[索引数字]
  • 待更新…

eg.


():使用函数时

元组(tuple)

  • 元组的元素不能修改
  • 元组中的元素类型也可以不相同
  • 元组与字符串类似,可以被索引且下标索引从0开始,-1 为从末尾开始的位置。也可以进行截取
  • 虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表
元组的截取和连接
tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2 ) 
tinytuple = (123, 'runoob') 
print (tuple) # 输出完整元组 
print (tuple[0]) # 输出元组的第一个元素 
print (tuple[1:3]) # 输出从第二个元素开始到第三个元素 
print (tuple[2:]) # 输出从第三个元素开始的所有元素 
print (tinytuple * 2) # 输出两次元组 
print (tuple + tinytuple) # 连接元组
构造只有一个元素或者没有元素
tup1 = ()    # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
[亿点补充]元组的函数
编号函数描述
1cmp(tuple1, tuple2)比较两个元组的元素
2len(tuple)给出元组的总长度
3max(tuple)从元组返回最大值项
4min(tuple)从元组返回最大值项
5tuple(seq)将列表转换为元组
[亿点补充]元组的意义——namedtuple()函数

既然tuple和list比起来没差,为什么要有这个数据呢?

  • 元组适合存放那些无需修改的数据(保护数据)
  • 具名元组namedtuple,也叫 带字段名的记录
  • 实现多值返回

eg.

from collections import namedtuple
# 生成一个City类
City = namedtuple("City", "name country polulation coordinates")
# 实例化
tokyo = City("Tokyo", 'JP', '36.93', ('35.68','139,69'))

print(tokyo)
# City(name='Tokyo', country='JP', polulation='36.93', coordinates=('35.68', '139,69'))

print(tokyo.name)
# Tokyo

# 打印字段名
print(City._fields)
('name', 'country', 'polulation', 'coordinates')

# 生成新实例
LatLong = namedtuple('LatLong', 'lat long')
Xiamen_tuple = ('Xiemen', 'China', '40.54', LatLong(24.26,118.03))
Xiamen = City._make(Xiamen_tuple)

print(Xiamen)
# City(name='Xiemen', country='China', polulation='40.54', coordinates=(24.26, 118.03))

集合(Set)

  • 基本功能是进行成员关系测试和删除重复元素
  • 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'} 
print(student) # 输出集合,重复的元素被自动去掉 
# set可以进行集合运算 
a = set('abracadabra')
b = set('alacazam') 
print(a) 
print(a - b)   # a 和 b 的差集 
print(a | b)   # a 和 b 的并集 
print(a & b)   # a 和 b 的交集 
print(a ^ b)   # a 和 b 中不同时存在的元素
#{'Jim', 'Mary', 'Tom', 'Rose', 'Jack'}
#{'r', 'a', 'b', 'd', 'c'}
#{'r', 'b', 'd'}
#{'r', 'l', 'a', 'b', 'm', 'd', 'c', 'z'}
#{'a', 'c'}
#{'r', 'l', 'd', 'b', 'm', 'z'}

字典(Dictionary)

  • 字典是无序的对象集合
  • 字典当中的元素通过来存取
  • 字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合
  • 键(key)必须使用不可变类型
  • 在同一个字典中,键(key)必须是唯一
[亿点补充]字典到底是干嘛的?
  1. 字典是 Python 用于存放具有映射关系的数据。
    比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。
    字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value
    映射关系
  2. 由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复
  3. 元组可以作为 dict 的 key,但列表不能作为dict的 key,这是因为键(key)必须使用不可变类型
关于怎么创建一个字典

第一种创建方式

# 创建包含3组key-value对的字典
vegetables = [('celery', 1.58), ('brocoli', 1.29), ('lettuce', 2.19)]
dict3 = dict(vegetables)
print(dict3) 
# {'celery': 1.58, 'brocoli': 1.29, 'lettuce': 2.19}

cars = [['BMW', 8.5], ['BENS', 8.3], ['AUDI', 7.9]]
# 创建包含3组key-value对的字典
dict4 = dict(cars)
print(dict4) 
# {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}

第二种创建方式(此时key不需要加''单引号

# 使用关键字参数来创建字典
dict6 = dict(spinach = 1.39, cabbage = 2.59)
print(dict6) # {'spinach': 1.39, 'cabbage': 2.59}

第三种创建方式(对不存在的key赋值,就是增加key-value对)

# 对不存在的key赋值,就是增加key-value对
dict3['potato'] = 2.22
print(dict3) 
# {'celery': 1.58, 'brocoli': 1.29, 'lettuce': 2.19,'spinach': 1.39,'cabbage': 2.59, 'potato': 2.22}

创建一个空字典

# 创建空的字典
dict5 = dict()#或者dict5={}
print(dict5) 
# {}
一些基本操作
# 通过key访问value
print(dict3['cabbage'])
#{'cabbage': 2.59}

#删除一个key-value对
del dict3['cabbage']

# 对存在的key-value对赋值,改变key-value对
dict3['potato']=3.33

#判断字典是否包含指定的 key
print('cabbage' in dict3) # False
print('potato' not in dict3) #False
print('lettuce' in dict3)#True

What’s more 👉 Python字典及基本操作(dict的自带函数)

Numpy


非常有用的Numpy官方网站👇

https://numpy.org/doc/stable/index.html

有一定英语基础的可以去看看


Numpy数组和列表很类似,

  1. 数组可以比较方便的进行一些数学运算,而列表则比较麻烦;
  2. 数组可以支持多维的数据,而列表通常只能储存一维的数据
import numpy as np
a = [1, 2, 3, 4]
b = np.array([1, 2, 3, 4])
print(a)
print(b)
print(type(a))
print(type(b))

列表和数组有着相同的索引机制,唯一的区别就是数组里面是通过空格加粗样式分隔元素,而列表用的是逗号

print(b[1])
print(b[0:2])
#[1 2]
c = a * 2 #列表*2,重复列表内容两次
d = b * 2#数组*2,数组内容数值*2
print(c)#[1, 2, 3, 4, 1, 2, 3, 4]
print(d)#[2 4 6 8]

创建列表多数是一维的数据,但是numpy可以有多维的数据

e = [[1,2], [3,4], [5,6]] # 列表里的元素为小列表
f = np.array([[1,2], [3,4], [5,6]]) # 创建二维数组的一种方式
print(e)
#[[1, 2], [3, 4], [5, 6]]
print(f)
#[[1 2]
 [3 4]
 [5 6]]

创建数组

a=np.array([1,2,3,4])#一维数据
b=np.array([1,2,3],[4,5,6],[7,8,9])#三行三列的数组
c=np.arange(1,10,2)#参数1是起点,参数2是终点,参数3是步长
d=np.random.randn(40)#创建服从标准正态分布的40个随机数字,形成一维数组
e=(np.random.randn(3,4)+5)*2#创建服从正态分布(5,4)的,3行4列的数组
f=np.random.arange(12).reshape(3,4)#创建三行四列的数组
g = np.random.randint(0, 10, (4, 4))#创建范围在[0,10]内的四行四列的随机整数数组
print(g)
# Out[]
[[3 9 9 2]
 [3 0 4 6]
 [0 2 1 9]
 [8 0 8 5]]
**numpy.arange

numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)
返回一组给定间隔的均匀分布的值,返回的是numpy.ndarray(多维数组)
给定范围是左闭右开区间 [start, stop)

👉See also

  1. numpy.linspace
    numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)[source]
    Return evenly spaced numbers over a specified interval.
    Returns num evenly spaced samples, 计算的是闭区间 [start, stop].
    但是右端点可以利用参数endpoint=False选择性打开.
    返回的是numpy.ndarray
d=np.linspace(2,3,num=5)
d
#Out[] array([2.  , 2.25, 2.5 , 2.75, 3.  ])

dtype可以设置数值类型,但是系统自动筛选的数值类型不会是int,哪怕输出的是整数,用的还是float
If dtype is not given, the data type is inferred from start and stop.
The inferred dtype will never be an integer; float is chosen even if the arguments would produce an array of integers.

d=np.linspace(2,3,num=5,dtype=str)
d
#Out[1] array(['2.0', '2.25', '2.5', '2.75', '3.0'], dtype='<U32')
d=np.linspace(2,3,num=5,dtype=int)
d
#Out[2] array([2, 2, 2, 2, 3])

Pandas


Pandas官方网站👇

https://pandas.pydata.org/pandas-docs/stable/index.html

Pandas主要有两种数据结构:Series和DataFrame

Series

Series类似于通过Numpy产生的一维数组,不同的是Series对象不仅包含数值,还包含一组索引

创建Series
import pandas as pd
s=pd.Series([1,2,3])
s
#Out[]
0    1
1    2
2    3
dtype: int64
s1 = pd.Series(['丁一', '王二', '张三'])
print(s1)
#Out[]
0    丁一
1    王二
2    张三
dtype: object
print(s1[1])
#Out[] 王二

但是Series一般不单独使用,多数用的是DataFrame,从DataFrame里用变量名提取出来的往往是Series格式

DataFrame

创建DataFrame
#第一种创建
s=[[1, 2], [3, 4], [5, 6]]
a = pd.DataFrame(s)
a

#第二种创建
a = pd.DataFrame([[1, 2], [3, 4], [5, 6]])
a
#Out[]
	0	1
0	1	2
1	3	4
2	5	6

#第三种创建
b = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=['date', 'score'], index=['A', 'B', 'C'])
#Out[]
   date	score
A	1	  2
B	3	  4
C	5	  6

#第四种创建
c = pd.DataFrame()  # 创建一个空DataFrame 
c["data"]=[1,2,3,4]
c["score"]=[5,6,7,8]
c
#Out[]
  data	score
0	1	 5
1	2	 6
2	3	 7
3	4	 8

#第五种创建
d = pd.DataFrame()  # 创建一个空DataFrame 
date = [1, 3, 5]
score = [2, 4, 6]
d['date'] = date
d['score'] = score
d
#Out[]
  date	score
0	1	 2
1	3	 4
2	5 	 6
通过字典创建DataFrame
course=pd.DataFrame({'class':['ShiJianXuLie','ChouYangDiaoCha','YingYongHuiGui'],'teacher':['GaoRui','FangMaoZhong','YuHaoDong']})
course
#Out[]
    class	        teacher
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong

这里也可以在函数里面加上index=['a','b','c'],那么行索引列的0,1,2就会变成a,b,c

course=pd.DataFrame({'class':['ShiJianXuLie','ChouYangDiaoCha','YingYongHuiGui'],'teacher':['GaoRui','FangMaoZhong','YuHaoDong']},index=['a','b','c'])
course
#Out[]
    class	       teacher
a	ShiJianXuLie	GaoRui
b	ChouYangDiaoCha	FangMaoZhong
c	YingYongHuiGui	YuHaoDong
pandas.DataFrame.from_dict()

pd.DataFrame.from_dict(data, orient='columns', dtype=None, columns=None)[source]
把字典转换成dataframe:
Creates DataFrame object from dictionary by columns or by index allowing dtype specification.

通过orient='indexorient='columns来控制字典中的key是行索引还是列索引,不设置则默认是orient='columns

import pandas as pd
f={'class':['ShiJianXuLie','ChouYangDiaoCha','YingYongHuiGui'],'teacher':['GaoRui','FangMaoZhong','YuHaoDong']}
pd.DataFrame.from_dict(f,orient='columns')
#Out[]
    class	        teacher
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong

import pandas as pd
f={'class':['ShiJianXuLie','ChouYangDiaoCha','YingYongHuiGui'],'teacher':['GaoRui','FangMaoZhong','YuHaoDong']}
pd.DataFrame.from_dict(f,orient='index')
#Out[]
              0	              1	             2
class	ShiJianXuLie	ChouYangDiaoCha	YingYongHuiGui
teacher	GaoRui	        FangMaoZhong	YuHaoDong
转置

在数据框后用.T对数据框进行转置

print(c)#原数据框
print(c.T)#转置后的数据框
用numpy创建数据框

记得import numpy as np

import numpy as np
a=np.arange(12).reshape(3,4)
c=pd.DataFrame(a)
a
#Out[]
    0	1	2	3
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11

#或者👇
c1=pd.DataFrame(a,columns=['a','b','c','d'],index=[1,2,3])#加了个行索引和列索引
c1
#Out[]
    A	B	C	D
1	0	1	2	3
2	4	5	6	7
3	8	9	10	11
rename()

利用映射改变行索引,列索引,坐标轴
DataFrame.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')
[level:int, str, tuple, or list, default None]

f
#Out[]
    class	        teacher
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong

f.rename(columns={'class':'课程','teacher':'老师'},inplace=True)
#Out[]
     课程	        老师
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong

#在函数中加上inplace=True,那么f在索引上的改变就被赋值给自己了,不需要再新建一个df进行赋值;如若不然,这个索引的改变并没有实际改变在f本身上,即并没有改变原表格结构

set_index()/reset_index()

set_index()
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)[source]
将数据框中的某一列数据作为索引

f
#Out[]
    课程	        老师
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong

f.set_index('课程',inplace=False)#inplace的默认就是False,可以不写
#Out[]
                老师
课程	
ShiJianXuLie	GaoRui
ChouYangDiaoCha	FangMaoZhong
YingYongHuiGui	YuHaoDong

f.index.name='序号'#直接给索引起名字
#Out[]
	 课程	       老师
序号		
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong

reset_index()
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
level见👉rename
重置索引名称,并且还原成默认
Reset the index of the DataFrame, and use the default one instead

f.reset_index()
#Out[]
   序号	  课程	        老师
0	0	ShiJianXuLie	GaoRui
1	1	ChouYangDiaoCha	FangMaoZhong
2	2	YingYongHuiGui	YuHaoDong

f.reset_index(drop=True)#drop=True 可以删除掉序号那一列
#Out[]
   	  课程	        老师
0	ShiJianXuLie	GaoRui
1	ChouYangDiaoCha	FangMaoZhong
2	YingYongHuiGui	YuHaoDong
数据读取、写入(报错解决)

pd.read_csv( )
这里仅仅展示常用的参数,完整的参数太长了
pd.read_csv(filepath_or_buffer,sep=NoDefault.no_default, header='infer', names=NoDefault.no_default, index_col=None,dtype=None,encoding=None)

  1. sep 默认值为',' 因为csv文件里面的分隔符不是,而导致的乱码,需要手动设置这个参数
  2. header 默认值为header=0等价于header='False'当导入的文件第一行自带变量名,一定要改成header=1或者header='True'
  3. names 当导入的文件需要第一行的变量名,则使用这个参数。如果已经有变量名,需要补上header=0再添加新的变量名
  4. index_col 可以选择文件中的变量设置为索引,eg. index_col=0即数据框第一列设置为索引
  5. dtype 以字典格式可以把不同列分别设置成不同的数据类型,eg.dtype={'a':np.float64,'b':np.int32}
  6. encoding 文字乱码,尤其是中文字,可以通过encoding='gbk'或者encoding='UTF-8'解决

绝对路径写法👇

data.to_excel('E:\\大数据分析\\data.xlsx') 

相对路径写法👇前提是先把文件导入了Python的Homepage

data1=pd.read_csv('附件.csv')

不同数据类型的导入代码,有少数参数不同

data=pd.read_csv()
data=pd.read_excel()

sheet_name=0导入excel的sheet1,默认值是导入所有sheet
sheet_name='Sheet1'导入sheet的名字是’Sheet1’的sheet

data=pd.read_table()#用这个可以导入文本文件

pandas.DataFrame.to_excel
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, encoding=None, inf_rep='inf')

  1. na_rep='' 写入的数据的缺失值的表示方式
  2. float_format=" " 设置小数格式 eg.float_format="%.2f"保留两位小数
  3. inf_rep='inf'设置无穷大的表示方式
DataFrame的提取数列
course
#Out[]
    class	        teacher
a	ShiJianXuLie	GaoRui
b	ChouYangDiaoCha	FangMaoZhong
c	YingYongHuiGui	YuHaoDong

course['class']#这里返回的是一维的series,所以没有表头
#Out[]
a       ShiJianXuLie
b    ChouYangDiaoCha
c     YingYongHuiGui
Name: class, dtype: object

course[['class']]#这里返回的是二维的表格数据
#Out[]
    class
a	ShiJianXuLie
b	ChouYangDiaoCha
c	YingYongHuiGui

提取多组列数据

course[['class','teacher']]
#Out[]
    class	        teacher
a	ShiJianXuLie	GaoRui
b	ChouYangDiaoCha	FangMaoZhong
c	YingYongHuiGui	YuHaoDong
iloc

提取行数据

course[1:3]#提取第二到第三行,注意左闭右开原则
course[01]#提取第一,第二行
course.iloc[0:2]#提取第一到第二行
在这里插入代码片
df.iloc[1,1]#提起第二行第二列的数据
df.iloc[[1,2],[3,4]]#提取第二行,第三行以及第四列第五列的交点的数据
df.iloc[1:3,3:6]#提取第二到第三行,第三列到第六列的交点的数据
df.iloc[:,[True,False,True,False]]#这里假设只有四列数据,那么提取的就是第一列和第三列的所有行数据
loc

Note that contrary to usual python slices,both the start and the stop are included

loc可以通过行索引提取数据

df.loc[['viper', 'sidewinder']]#提取viper行和sidewinder行
df.loc['cobra', 'shield']#提取cobra行,shield列的数据

除了像iloc选取数列,loc函数更多还有一个筛选的功能

df.loc[df['shield'] > 35] = 0#筛选df数据框中shield>35的数据,并且赋值为0
df.loc[df['shield']=35]#筛选df数据框中shield值等于5的数据
df.loc[:,'max_speed'] = 30#让max_speed所有行都改为30

这里不需要inplace

dtype

DataFrame.dtypes
This returns a Series with the data type of each column. The result’s index is the original DataFrame’s columns. ==Columns with mixed types are stored with the object dtype. ==

drop

DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
argument:
axis=1 代表drop labels from the ‘columns’,axis=0(默认值)代表drop labels from the 'index’
inplace=True代表改变原数据结构,覆盖原数据
eg.

#删除变量名为B和C的列
df.drop(['B', 'C'], axis=1)
df.drop(columns=['B', 'C'])

df.drop(['a','c'])#删除index为a和c的行
df.drop([0, 1])#删除第一,第二行

df.drop(index='a', columns='A',inplace=True)#删除index为a的行数据和变量名为A的列数据,覆盖原数据

DataFrame.dropna
DataFrame.drop_duplicates

Please turn to 案例分析.数据预处理

案例分析

数据预处理

缺失值

.isna()

DataFrame.isna()
Detect missing values
Series也可以用这个函数
❗ 类似于空的字符串‘’无穷大值不被考虑为NA值
返回的数据是一个同样大小的bool型数值矩阵:

    age   born  name    toy
0   True  False  True  False
1   True   True  True   True
2  False   True  True   True

那么怎么显示所有缺失值的行呢?

df.isna().sum()#显示所有变量的缺失值个数
df.info()#显示所有变量的数据个数和数据格式
df[df['A'].isna()]#这里假设,在第一步我查看出‘A’列有缺失值,那么可以显示‘A’列所有出现缺失值的行

注意**.info.()不适用于series**,所以如果要查看某一列的数据,要转换成dataframe的格式,即:

df['A'].info()#会报错×
df[['A']].info()#可以运行√
.dropna()

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
Remove missing values.

argument:
how=‘any’ 默认值,如果该列(行)内有任何数据缺失,则删除
how='all'如果该列(行)所有数据都缺失,则删除
subset=''如果subset指定的变量在该行(列)有缺失,则删除

除了删掉缺失值列以外,如果遇到样本数据有限的情况,我们可以选择填补缺失值,那么就有

.fillna()

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

arguments:
method:{'backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}
method='ffill/pad'用缺失值上一个有效观测值填补
method='bfill/backfill'用缺失值下一个有效观测值填补

df.fillna(0)#用0填补所有缺失值
df.fillna(method='bfill',implace=True)#用每个缺失值各自的后一项有效观测值填补

df['A'].fillna(0,inplace=True)#用0填补'A'列的缺失值
df['B'].fillna(method='ffill',inplace=True)#用前一个有效观测值填补'B'列

#分别用0,1,2,3填补'A','B','C','D'列的缺失值
values = {"A": 0, "B": 1, "C": 2, "D": 3}
df.fillna(value=values)

重复值

.duplicated()

DataFrame.duplicated(subset=None, keep='first')
返回一组bool数据的数据框,重复值处显示True,非重复值处显示False

df.duplicated(subset='style')#返回一组bool数列
df[df.duplicated(subset='style')]#显示在style列有重复的所有重复行
.drop_duplicates()

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
==返回已经被去除重复数据的数据框,默认不改变原
时间格式的数值将会被忽略

arguments:
keep:{‘first’, ‘last’, False}, default ‘first’
默认保留第重复数据行中的第一行,也可以改变选择保留最后一个
subset与**.dropna()**用法一致

eg.

#删除在'brand'和'style'中有重复的数据行,并保留重复行中的最后一行
df.drop_duplicates(subset=['brand', 'style'], keep='last')

数据改格式

.astype()

DataFrame.astype(dtype, copy=True, errors='raise')

arguments:

  1. dtypedata: type, or dict of column name -> data type
    eg.
df.astype('int32')#把整个数据框所有数据格式都改成'int32'
df.astype({'col1': 'int32'})#只把col1这个变量下的数据格式改成'int32'
  1. errors:‘raise’, ‘ignore’,default ‘raise’
  • raise : 所有改格式出错的数据都会被报错

  • ignore : 所有改格式不成功的数据将会以object的形式显示,而非报错.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值