Bootstrap

数据分析神兵利器之Pandas(0基础可懂)(●‘◡‘●)

文章目录

零基础之pandas

一.pandas基础知识

1.pandas初认识

import pandas as ps
data={
    'name':['lcl','小明','小红'],
    'age':[10,20,30],
}
df=ps.DataFrame(data)
print(type(df))
print(df)

运行结果:

<class 'pandas.core.frame.DataFrame'>
  name  age
0  lcl   10
1   小明   20
2   小红   30
进程已结束,退出代码为 0

初步收获:

​ 我们发现dataframe可以把一个字典格式的数据转换成类似于excel表格的列表形式。

2.pandas数据结构之Series

#### 2.1series概念

​ pandas Series类似于表格中的一个列(column),类似于一维数组,可以保存任何数据类型。

​ Series由索引(index)和列组成,函数如下:

pandas.Series(data,index,dtype,name.copy)

参数说明:

data:⼀组数据(ndarray 类型)。

index:数据索引标签,如果不指定,默认从 0 开始。

dtype:数据类型,默认会⾃⼰判断。

name:设置名称。

copy:拷⻉数据,默认为 False。

data可以是列表,也可以是字典。

​ 如果是列表,不指定index参数,默认index从0开始,指定index的话需要和列表中的数据个数一致

​ 如果是字典,不指定index,默认索引为字典的全部key,指定index的话可以选取部分字典数据

2.2创建⼀个简单的 Series 实例:
import pandas as pd
data1=[3,2,4]
data2=['a','b','c']
s1=pd.Series(data1)
s2=pd.Series(data2)
print(type(s1))
print(type(s2))
print(s1)
print(s2)

输出如下:

<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>

0    3
1    2
2    4
dtype: int64  #数字类型

#索引	数据
0    a
1    b
2    c
#数据类型
dtype: object #字符串类型,但在python中字符串为对象类型

从上图可知,如果没有指定索引,索引值就从0开始

我们可以根据索引值读取数据

print(s1[0])
2.3指定索引值
a=['小明','小红','小亮']
myvar=pd.Series(a,index=['x','y','z'])
print(myvar)
x    小明
y    小红
z    小亮
dtype: object

索引取值:

myvar[‘x’]:小明

2.4使⽤ key/value 对象,类似字典来创建 Series:
import pandas as pd
data = {1: "哈哈", 2: "呵呵", 3: "喜喜"}
myvar = pd.Series(data)
print(myvar)

out:

1    哈哈
2    呵呵
3    喜喜
dtype: object

从上可知,字典的 key 变成了索引值。

如果我们只需要字典中的⼀部分数据,只需要指定需要数据的索引即可,如下:

import pandas as pd
data = {1: "哈哈", 2: "呵呵", 3: "喜喜"}
myvar = pd.Series(data, index = [1, 3]) #可以index参数指定索引
print(myvar)

out:

1    哈哈
3    喜喜
dtype: object
2.5设置 Series 名称参数:
myvar = pd.Series(data, index = [1, 3],name='小明') #参数name设置series名称
print(myvar)

out:

1    哈哈
3    喜喜
Name: 小明, dtype: object #我们输出时多了name属性

3 Pandas 数据结构 之DataFrame

3.1DataFrame初认识

​ DataFrame 是⼀个表格型的数据结构,它含有⼀组有序的列,

每列可以是不同的值类型(数值、字符串、布尔型值)。

​ DataFrame 既有⾏索引也有列索引,它可以被看做由 Series

组成的字典(共同⽤⼀个索引)。
在这里插入图片描述
在这里插入图片描述

3.2DataFrame 构造⽅法
pandas.DataFrame( data, index, columns, dtype,copy)

参数说明:

data:⼀组数据(ndarray、series, map, lists, dict 等类

型)。

index:索引值,或者可以称为⾏标签。

columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。

dtype:数据类型。

copy:拷⻉数据,默认为 False。

3.3使用列表创建实例

Pandas DataFrame 是⼀个⼆维的数组结构,类似⼆维数组。

实例 - 使⽤列表创建

import pandas as pd
data=[['小明',10,200],['小红',12,300],['小亮',100,300]]
df=pd.DataFrame(data,columns=['name','age','account'],dtype=float)
print(df)

类似于一个二维数组,创建时columns参数就是设置列索引,dtype就是设置数据类型,index和series一样设置行索引

out:

name    age  account
0   小明   10.0    200.0
1   小红   12.0    300.0
2   小亮  100.0    300.0
3.4使⽤ ndarrays 创建

ndarray ( N 维数组)是⼀个快速且灵活的数据集容器

​ 实例 - 使⽤ ndarrays 创建

import pandas as pd
# data=[['小明',10,200],['小红',12,300],['小亮',100,300]]
# df=pd.DataFrame(data,columns=['name','age','account'],dtype=float)
data={'name':['小明','小红','小亮'],'age':[10,12,100],'account':[200,300,300]}
df=pd.DataFrame(data)
print(df)

out:

name  age  account
0   小明   10      200
1   小红   12      300
2   小亮  100      300

​ 从以上输出结果可以知道, DataFrame 数据类型⼀个表格,

包含 rows(⾏)和 columns(列):

在这里插入图片描述

还可以使⽤字典(key/value),其中字典的 key 为列名:

3.5实例 - 使⽤字典创建
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10,'c': 20}]
df = pd.DataFrame(data)
print(df)

out:

   a   b     c
0  1   2   NaN
1  5  10  20.0

没有对应的部分数据为NaN

3.6使用loc获取指定行数据

Pandas 可以使⽤loc属性返回指定⾏的数据,如果没有设置索引,第⼀⾏索引为0,第⼆⾏索引为1

当然也可以loc[行索引,列索引]精准索引确认某数据

data={
    "calories": [420, 380, 390],
    "duration": [50, 40, 45]
}
df = pd.DataFrame(data)
# 返回第⼀⾏
print(df.loc[0])
# 返回第⼆⾏
print(df.loc[1])
print(type(df.loc[2]))

out

calories    420
duration     50
Name: 0, dtype: int64
calories    380
duration     40
Name: 1, dtype: int64
<class 'pandas.core.series.Series'>

Pandas 可以使⽤loc属性返回指定索引对应到某⼀⾏:

因此我先把dataframe每一行都认为是series对象,列索引为每个series对象的索引!!!!!

**注意:**返回结果其实就是⼀个 Pandas Series 数据。

也可以返回多⾏数据,使⽤**[[ … ]]格式,…**为各⾏的索引,以逗号隔开:

如下:

data={
    "calories": [420, 380, 390],
    "duration": [50, 40, 45]
}
df = pd.DataFrame(data)
print(df)
print(type(df.loc[[1,2]]))
print(df.loc[[1,2]])

out:

   calories  duration
0       420        50
1       380        40
2       390        45
<class 'pandas.core.frame.DataFrame'>
   calories  duration
1       380        40
2       390        45

注意:返回结果其实就是⼀个 Pandas DataFrame 数据。

我们可以指定索引值,如下实例:

data={
    "calories": [420, 380, 390],
    "duration": [50, 40, 45]
}
df = pd.DataFrame(data,index=['d1', 'd2', 'd3'])
print(df)
print(type(df.loc[['d1','d2']]))
print(df.loc[['d1','d2']])

out: index参数就是设置行索引!!!!

    calories  duration
d1       420        50
d2       380        40
d3       390        45
<class 'pandas.core.frame.DataFrame'>
    calories  duration
d1       420        50
d2       380        40
3.6.1loc小结:

​ Pandas 可以使⽤loc属性返回指定索引对应到某⼀⾏

​ 如果指定某一行,即df.loc[索引名],返回的是Series对象

​ 如果指定多行,即df.loc[[索引名1,索引名2,...]],返回的仍然是Dateframe对象

二.pandas CSV文件

Pandas 可以很⽅便的处理 CSV ⽂件本⽂以 nba.csv为例

1.CSV文件概述

​ CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其⽂件以纯⽂本形式存储表格数据(数字和⽂本)。

​ CSV 是⼀种通⽤的、相对简单的⽂件格式,被⽤户、商业和科学⼴泛应⽤。

2.pandas之写csv文件 :to_csv()

​ 我们可以使⽤**to_csv()**⽅法将 DataFrame 存储为 csv ⽂件:

import pandas as pd
# 三个字段 name, site, age
name = ["小明", "小红", "小亮", "小林"]
site = ["www.xiaoming.com", "www.xiaohong.com","www.xiaoliang.com", "www.xiaolin.org"]
age = [90, 40, 80, 98]
# 字典
dict = {'name': name, 'site': site, 'age': age}
#生成了dataframe对象
df = pd.DataFrame(dict)
print(df)
df.to_csv('./info.csv')

out:

  name               site  age
0   小明   www.xiaoming.com   90
1   小红   www.xiaohong.com   40
2   小亮  www.xiaoliang.com   80
3   小林    www.xiaolin.org   98

上方是df对象,写入csv后打开csv如下:

在这里插入图片描述

注意:在写⼊csv⽂件会默认将索引写⼊如果不需要索引则需添加参数进⾏处理

df.to_csv('site.csv', index=False)

3.pandas之读csv文件 : ps:pd.read_csv(‘nba.csv’)其返回dataframe对象

​ to_string()⽤于返回 DataFrame 类型的数据,如果不使⽤该

函数,则输出结果为数据的前⾯ 5 ⾏和末尾 5 ⾏,中间部分以

**…**代替。

例如:

import pandas as pd
data=pd.read_csv('./info.csv')
print(type(data))
print(data)

out:

<class 'pandas.core.frame.DataFrame'>
   Unnamed: 0 name               site  age
0           0   小明   www.xiaoming.com   90
1           1   小红   www.xiaohong.com   40
2           2   小亮  www.xiaoliang.com   80
3           3   小林    www.xiaolin.org   98

注意

​ 它把我存入csv的索引也当成了数据读了进来,并自动又创建了索引。

4.数据处理

​ **to_string()⽤于返回 DataFrame 类型的数据,如果不使⽤该函数,则输出结果为数据的前⾯ 5 ⾏和末尾 5 ⾏,中间部分以…**代替。

​ 即dataframe类型数据过多时中间会用**…**替代,而转换为str类型就会全部显示

data=pd.read_csv('./info.csv')
print(type(data)) #<class 'pandas.core.frame.DataFrame'>
print(type(data.to_string())) #<class 'str'>
4.1head()

​ **head( n)**⽅法⽤于读取前⾯的 n ⾏,如果不填参数 n ,默认返回 5 ⾏。

import pandas as pd
data=pd.read_csv('./info.csv')
print(type(data))
print(data.head())
print(data.head(10))

out:

<class 'pandas.core.frame.DataFrame'>
   Unnamed: 0 name               site  age
0           0   小明   www.xiaoming.com   90
1           1   小红   www.xiaohong.com   40
2           2   小亮  www.xiaoliang.com   80
3           3   小林    www.xiaolin.org   98
4           3   小林    www.xiaolin.org   98
   Unnamed: 0 name               site  age
0           0   小明   www.xiaoming.com   90
1           1   小红   www.xiaohong.com   40
2           2   小亮  www.xiaoliang.com   80
3           3   小林    www.xiaolin.org   98
4           3   小林    www.xiaolin.org   98
5           3   小林    www.xiaolin.org   98
6           3   小林    www.xiaolin.org   98
7           3   小林    www.xiaolin.org   98
8           3   小林    www.xiaolin.org   98
9           3   小林    www.xiaolin.org   98
4.2tail()

tail( n )⽅法⽤于读取尾部的 n ⾏,如果不填参数 n ,默认返回 5 ⾏,空⾏各个字段的值返回NaN

实例 :

import pandas as pd
data=pd.read_csv('./info.csv')
print(type(data))
print(data.tail())
print(data.tail(10))

out:

<class 'pandas.core.frame.DataFrame'>
    Unnamed: 0 name             site  age
11           3   小林  www.xiaolin.org   98
12           3   小林  www.xiaolin.org   98
13           3   小林  www.xiaolin.org   98
14           3   小林  www.xiaolin.org   98
15           3   小林  www.xiaolin.org   98
    Unnamed: 0 name             site  age
6            3   小林  www.xiaolin.org   98
7            3   小林  www.xiaolin.org   98
8            3   小林  www.xiaolin.org   98
9            3   小林  www.xiaolin.org   98
10           3   小林  www.xiaolin.org   98
11           3   小林  www.xiaolin.org   98
12           3   小林  www.xiaolin.org   98
13           3   小林  www.xiaolin.org   98
14           3   小林  www.xiaolin.org   98
15           3   小林  www.xiaolin.org   98
4.3info()

​ info() ⽅法返回表格的⼀些基本信息

import pandas as pd
data=pd.read_csv('./info.csv')
print(data.info())

out:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16 entries, 0 to 15   ps:行数,索引从0-15
Data columns (total 4 columns):  ps:列数,4列
 #   Column      Non-Null Count  Dtype   ps:各列的数据类型
---  ------      --------------  ----- 
 0   Unnamed: 0  16 non-null     int64 
 1   name        16 non-null     object
 2   site        16 non-null     object
 3   age         16 non-null     int64 
dtypes: int64(2), object(2)
memory usage: 640.0+ bytes
None

non-null 为⾮空数据,我们可以看到上⾯的信息中,得知哪一列空值最多

三.pandas Excel文件

​ Pandas提供了⾮常强⼤的功能操作Excel,是数据分析领域处理Excel⽂档的重要⼯具

1.1读取excel (与csv类似)

pd.read_excel()

1.2 写入Excel (与csv类似)

df.to_excel()

读写excel时有很多参数:

​ index 是否写⼊索引默认为True

​ header 是否写⼊表头默认True

​ sheet_name 写⼊哪个sheet⻚默认sheet1

​ startrow 写⼊Excel数据开始⾏默认0⾏

​ startcol 写⼊Excel数据开始列默认0列

1.3实例时参数header的区别

import pandas as pd
data_header_None=pd.read_excel('./excel.xlsx',sheet_name='pandas',header=None)
print('header=None时:')
print(data_header_None)
data_header_true=pd.read_excel('./excel.xlsx',sheet_name='pandas')
print('header=True时:')
print(data_header_true)

out

header=None时:
        0     1     2     3   4       5
0    销售年份  销售地区  销售人员    品名  数量   销售金额¥
1   43896    北京    苏珊  液晶电视   1  215000
2   44237    北京    李兵   微波炉   5  114400
3   43896    北京    苏珊   按摩椅  13  147000
4   44237    北京    赵琦   按摩椅  20   54400
5   44237    北京    白丁   微波炉  24   22400
6   43896    北京    白丁   微波炉  27   34500
7   44237    北京    白丁   按摩椅  28   36000
8   44237    北京    李兵   跑步机  30  132000
9   43896    北京    苏珊   显示器  33  265000
10  43896    北京    白丁  液晶电视  34   13500
11  44237    北京    赵琦   显示器  40   32500
12  44237    北京    赵琦  液晶电视  41   78000
13  43896    北京    白丁  液晶电视  43  170000
14  44237    北京    白丁   按摩椅  45   16000
15  43896    北京    苏珊  液晶电视  47    5000
16  43896    北京    苏珊   显示器  49  114000
17  44237    北京    李兵   跑步机  52   66000
18  44237    北京    赵琦   显示器  52  270000
19  43896    北京    苏珊  液晶电视  53  235000
20  44237    北京    赵琦  液晶电视  54   60000
21  44237    北京    李兵   跑步机  60   15400
22  44237    北京    赵琦   微波炉  65    2500
23  44237    北京    赵琦   按摩椅  68  115500
24  43896    北京    白丁   微波炉  69   12000
25  43896    北京    苏珊   显示器  76   49500
26  44237    北京    赵琦   显示器  77  205000
27  43896    北京    苏珊   显示器  98   73500
header=True时:
     销售年份 销售地区 销售人员    品名  数量   销售金额¥
0   43896   北京   苏珊  液晶电视   1  215000
1   44237   北京   李兵   微波炉   5  114400
2   43896   北京   苏珊   按摩椅  13  147000
3   44237   北京   赵琦   按摩椅  20   54400
4   44237   北京   白丁   微波炉  24   22400
5   43896   北京   白丁   微波炉  27   34500
6   44237   北京   白丁   按摩椅  28   36000
7   44237   北京   李兵   跑步机  30  132000
8   43896   北京   苏珊   显示器  33  265000
9   43896   北京   白丁  液晶电视  34   13500
10  44237   北京   赵琦   显示器  40   32500
11  44237   北京   赵琦  液晶电视  41   78000
12  43896   北京   白丁  液晶电视  43  170000
13  44237   北京   白丁   按摩椅  45   16000
14  43896   北京   苏珊  液晶电视  47    5000
15  43896   北京   苏珊   显示器  49  114000
16  44237   北京   李兵   跑步机  52   66000
17  44237   北京   赵琦   显示器  52  270000
18  43896   北京   苏珊  液晶电视  53  235000
19  44237   北京   赵琦  液晶电视  54   60000
20  44237   北京   李兵   跑步机  60   15400
21  44237   北京   赵琦   微波炉  65    2500
22  44237   北京   赵琦   按摩椅  68  115500
23  43896   北京   白丁   微波炉  69   12000
24  43896   北京   苏珊   显示器  76   49500
25  44237   北京   赵琦   显示器  77  205000
26  43896   北京   苏珊   显示器  98   73500

excel表格如下

在这里插入图片描述

注意默认把第一行作为表头读入,即列索引)

当前在读取Excel以后会默认把第⼀⾏作为表头,这样在写⼊的时候会⾃带格式,为了防⽌这个问题出现,所以需要再读取和写⼊的时候给定参数

​ 当前上⾯处理csv的所有⽅法在这⾥可以同样去使⽤,这⾥就不在过多赘述咯~

四.pandas数据清洗

数据清洗是对⼀些没有⽤的数据进⾏处理的过程。

​ 很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有⽤的数据进⾏处理。

​ 因此我们将利⽤ Pandas包来进⾏数据清洗。

1.清洗空值

1.1isnull的使用(查找空值)

csv文件内容如下:

在这里插入图片描述

#isnull的使用
import pandas as pd
df=pd.read_csv('info.csv')
#打印所有列
print(df)
#打印NUM_BEDROOMS
print(df['NUM_BEDROOMS'])
print(type(df['NUM_BEDROOMS']))

out:

           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
0      3
1      3
2    NaN
3      1
4      3
5    NaN
6      2
7      1
8     na
Name: NUM_BEDROOMS, dtype: object
<class 'pandas.core.series.Series'>

我们发现原本csv文件中的值n/a,NA读入时转换成了NAN,即为NULL类型,比如我们用isnull验证一下:

print(df['NUM_BEDROOMS'].isnull())
print(type(df['NUM_BEDROOMS'].isnull()))

out:

0    False
1    False
2     True
3    False
4    False
5     True
6    False
7    False
8    False
Name: NUM_BEDROOMS, dtype: bool
<class 'pandas.core.series.Series'>

我们发现数据na没有被转换成NAN,从而isnull之后为False,因此我们需要在实例化时添加参数,使其将对应的数据转换成NAN。

如下:

import pandas as pd
miss_values=['na','--','n/a']
df=pd.read_csv('info.csv',na_values=miss_values)
#打印NUM_BEDROOMS
print(df['NUM_BEDROOMS'].isnull())

out:

0    False
1    False
2     True
3    False
4    False
5     True
6    False
7    False
8     True
Name: NUM_BEDROOMS, dtype: bool

索引为8的数据变为了true

​ 代表成功将不需要的数据变为NAN,即为空,为之后清洗做准备

isnull()小结:

​ 读取的数据中有无效的数据,在我们将其转为dataframe对象时,应添加na_values参数将无用的目标数据转换为NAN,其为空后即可方便对其删除

1.2dropna()的使用 (删除空值)

如果我们要删除包含空字段的⾏,可以使⽤**dropna()**⽅法,

语法格式如下:

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

参数说明:

axis:默认为0,表示逢空值剔除整⾏,如果设置参数axis =1表示逢空值去掉整列。

how:默认为**'any’如果⼀⾏(或⼀列)⾥任何⼀个数据有出现 NA 就去掉整⾏,如果设置how=‘all’**⼀⾏(或列)都是 NA 才去掉这整⾏。

thresh:设置需要多少⾮空值的数据才可以保留下来的。

subset:设置想要检查的列。如果是多个列,可以使⽤列名的 list 作为参数。

inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

接下来的实例演示了删除包含空数据的⾏。

#dropna的使用
import pandas as pd
df=pd.read_csv('info.csv')
new_df=df.dropna()
print(df)
print(new_df)

out:

           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
           PID  ST_NUM    ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0     PUTNAM            Y            3        1  1000
1  100002000.0   197.0  LEXINGTOM            N            3      1.5    --
8  100009000.0   215.0    TREMONT            Y           na        2  1800

new_df所有包含空值的行都被删除了!!!!!!!!!!!!!!!!

1.2.1inplace参数(决定是否在源数据上修改)

默认情况下,dropna不会在源df上修改,而是复制产生了一个新的new_df

要想在源数据上修改,我们需要添加参数,示例如下:

new_df=df.dropna(inplace=True)
print(df)
print(new_df)

out:

           PID  ST_NUM    ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0     PUTNAM            Y            3        1  1000
1  100002000.0   197.0  LEXINGTOM            N            3      1.5    --
8  100009000.0   215.0    TREMONT            Y           na        2  1800
None

new_df为空,而原来的df发生改变了!!!

1.2.2 subset参数(指定根据某些列上是否有空值来删除)
import pandas as pd
df=pd.read_csv('info.csv')
new_df=df.dropna(subset=['NUM_BEDROOMS'])  #某列
#new_df=df.dropna(subset=['NUM_BEDROOMS','ST_NUM'])  #多列
print(df)
print(new_df)

out:

          PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
1.3fillna()的使用 (替换空值)

我们也可以**fillna()**⽅法来替换⼀些空字段:

​ 例如使⽤ 12345 替换空字段:

#fillna的使用
import pandas as pd
df=pd.read_csv('info.csv')
new_df=df.fillna(123456)
print(df)
print(new_df)

out:

           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
           PID    ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH   SQ_FT
0  100001000.0     104.0      PUTNAM            Y            3        1    1000
1  100002000.0     197.0   LEXINGTOM            N            3      1.5      --
2  100003000.0  123456.0   LEXINGTON            N       123456        1     850
3  100004000.0     201.0    BERKELEY           12            1   123456     700
4     123456.0     203.0    BERKELEY            Y            3        2    1600
5  100006000.0     207.0    BERKELEY            Y       123456        1     800
6  100007000.0  123456.0  WASHINGTON       123456            2   HURLEY     950
7  100008000.0     213.0     TREMONT            Y            1        1  123456
8  100009000.0     215.0     TREMONT            Y           na        2    1800

inplace参数与dropna同理

我们也可以指定某⼀个列来替换数据:

使⽤ 12345 替换 PID 为空数据:

import pandas as pd
df=pd.read_csv('info.csv')
new_df=df['PID'].fillna(123456,inplace=True)
print(df)
print(new_df)

out:

          PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4     123456.0   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
None

要对某列进行替换,我们只要选中某列再dropna()即可

替换空单元格的常⽤⽅法是计算列的均值、中位数值或众数

Pandas使⽤mean()、**median()mode()**⽅法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最⾼的数)。

1.3.1使⽤mean()、median()和mode()⽅法计算列的均值并替换空单元格:
#mean(),median() mode()的使用
import pandas as pd
df=pd.read_csv('info.csv')
print('原数据如下:')
print(df)
#---------------------------------------------------
mean=df['PID'].mean()  #求平均值
print('PID列的平均数为:',mean)
df['PID'].fillna(mean,inplace=True)  #替换该列空值为平均值
#---------------------------------------------------
median=df['ST_NUM'].median() #求该列中位数
print('ST_NUM列的中位数为:',median)
df['ST_NUM'].fillna(median,inplace=True) #替换该列空值为中位数
#------------------------------------------------------
mode=df['NUM_BATH'].mode()  #求该列众数
print('NUM列的众数为:',mode)
df['NUM_BATH'].fillna(mode,inplace=True) #替换该列空值为众数
#--------------------------------------------------------------
print('替换后的数据如下:')
print(df)

out:

原数据如下:
           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
PID列的平均数为: 100005000.0
ST_NUM列的中位数为: 203.0
NUM列的众数为: 0    1
Name: NUM_BATH, dtype: object
替换后的数据如下:
           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTOM            N            3      1.5    --
2  100003000.0   203.0   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4  100005000.0   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0   203.0  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800

进程已结束,退出代码为 0

2.清洗错误格式数据

​ 数据格式错误的单元格会使数据分析变得困难,甚⾄不可能。

​ 我们可以通过包含空单元格的⾏,或者将列中的所有单元格转换为相同格式的数据。

以下实例会格式化⽇期:

#清洗错误格式的数据
import pandas as pd
data={
    'name':['小红','小明','小亮'],
    'birthday':['2006/01/01','2003/06/01','20020612'],
}
df=pd.DataFrame(data)
print(df)
print('清洗后,将日期格式转换为正确的格式!')
df['birthday']=pd.to_datetime(df['birthday'])
print(df)

out:

  name    birthday
0   小红  2006/01/01
1   小明  2003/06/01
2   小亮    20020612
清洗后,将日期格式转换为正确的格式!
  name   birthday
0   小红 2006-01-01
1   小明 2003-06-01
2   小亮 2002-06-12

3.清洗错误数据(df.loc[2][‘age’]能查数据,但不能修改,修改要df.loc[2,'age']=18)

​ 数据错误也是很常⻅的情况,我们可以对错误的数据进⾏替换或移除。

以下实例会替换错误年龄的数据:

3.1替换已经确定位置的值
#清洗错误数据
import pandas as pd
data={
    'name':['小明','小红','小亮'],
    'age':[10,20,122],
}
df=pd.DataFrame(data)
print(df)
df.loc[2,'age']=18
#print(df.loc[2]['age'])
#df.loc[1]['age']=100  会报错
print(df)

out:

  name  age
0   小明   10
1   小红   20
2   小亮  122
  name  age
0   小明   10
1   小红   20
2   小亮   18

进程已结束,退出代码为 0
3.2也可以设置条件语句:将 age ⼤于 120 的设置为 120:
import pandas as pd
data={
    'name':['小明','小红','小亮'],
    'age':[10,20,122],
}
df=pd.DataFrame(data)
print(df)
for index in df.index:
    if df.loc[index,'age']>120:
        df.loc[index,'age']=120
print(df)

out:

  name  age
0   小明   10
1   小红   20
2   小亮  122
  name  age
0   小明   10
1   小红   20
2   小亮  120
3.3可以将错误数据的⾏删除:df.drop(index,…)

将 age ⼤于 120 的删除:

import pandas as pd
data={
    'name':['小明','小红','小亮'],
    'age':[10,20,122],
}
df=pd.DataFrame(data)
print(df)
for index in df.index:
    if df.loc[index,'age']>120:
        df.drop(index,inplace=True)
print(df)

out:

  name  age
0   小明   10
1   小红   20
2   小亮  122
  name  age
0   小明   10
1   小红   20

进程已结束,退出代码为 0

4.Pandas 清洗重复数据(所有列相同才为重复数据)

如果我们要清洗重复数据,可以使⽤**duplicated()drop_duplicates()**⽅法。

如果对应的数据是重复的,**duplicated()**会返回 True,否则返回 False。

4.1duplicated()
#删除重复数据
import pandas as pd
data={
    'name':['小明','小红','magician','小明','magician'],
    'age':[10,20,122,10,20],
}
df=pd.DataFrame(data)
print(df)
print(df.duplicated())

out:

       name  age
0        小明   10
1        小红   20
2  magician  122
3        小明   10
4  magician   20
0    False
1    False
2    False
3     True
4    False
dtype: bool

我们发现要所有列全一样才为重复数据!

4.2drop_duplicates()
import pandas as pd
data={
    'name':['小明','小红','magician','小明','magician'],
    'age':[10,20,122,10,20],
}
df=pd.DataFrame(data)
print(df)
df.drop_duplicates(inplace=True)
print(df)

out:

       name  age
0        小明   10
1        小红   20
2  magician  122
3        小明   10
4  magician   20
       name  age
0        小明   10
1        小红   20
2  magician  122
4  magician   20

现在我假设有如下情景,只要name相同,我就要删除重复的后面的数据,只保留第一个name,是否可以如下操作?

import pandas as pd
data={
    'name':['小明','小红','magician','小明','magician'],
    'age':[10,20,122,10,20],
}
df=pd.DataFrame(data)
print(df)
print(df['name'].duplicated())
df['name'].drop_duplicates(inplace=True)
print(df)

out:

       name  age
0        小明   10
1        小红   20
2  magician  122
3        小明   10
4  magician   20
-----------------------
0    False
1    False
2    False
3     True
4     True
Name: name, dtype: bool
----------------------------
       name  age
0        小明   10
1        小红   20
2  magician  122
3        小明   10
4  magician   20

删除失败!!!!!!!!!!!!!!

new_df=df['name'].drop_duplicates()
print(new_df)

out:

0          小明
1          小红
2    magician
Name: name, dtype: object

进程已结束,退出代码为 0

假想错误,经过百度查得:

可以添加subset参数来选择某列来进行判断重复标准来进行删除

4.3根据指定列发生重复进行删除(subset参数的使用)
import pandas as pd
data={
    'name':['小明','小红','magician','小明','magician'],
    'age':[10,20,122,10,20],
}
df=pd.DataFrame(data)
print(df)
df.drop_duplicates(subset='name',inplace=True)
print(df)

out:

       name  age
0        小明   10
1        小红   20
2  magician  122
3        小明   10
4  magician   20
       name  age
0        小明   10
1        小红   20
2  magician  122

进程已结束,退出代码为 0
;