python高级--数据分析(Pandas库)

Pandas 库
数据分析三剑客:NumPy Pandas Matplotlib

一、Series

Series是一种类似于一维数组的对象由两部分组成
· index:相关的所居索引标签
· values:一组数据(ndarray类型)

1、创建

Series(data=None,index=None,dtype=None, name=None, copy=False, fastpath=False)

data:一组数据
index:索引(默认为 0,1,2,…)
name:这个对象的名字
注意:传入的索引要和数据对应,多传或少传会报错

1)简单直接创建

#直接传入一个列表即可创建,索引默认
>>> Series([1,2,3,4])
0    1
1    2
2    3
3    4
dtype: int64
#传入数据和索引
>>> Series(data=[1,2,3,4],index=['A','B','C','D'])
A    1
B    2
C    3
D    4
dtype: int64
#一般这样传入比较简单
>>> Series(data=[1,2,3,4],index=list('ABCD'))

2)字典形式创建

一般不这样创建,比较麻烦

>>> Series({'A':1,"B":2,"C":3,"D":4})
A    1
B    2
C    3
D    4
dtype: int64

2、索引和切片

单个元素的索引与列表索引类似,返回单个索引类型
取多个索引,返回的是一个series类型
1)字符索引取值:
· 使用index中的元素作为索引值
· 使用 .loc[ ] 取值(推荐)
· 注意:字符索引是闭区间 [ start, end ]
2)数字索引取值:
· 使用整数作为索引值
· 使用 .iloc[ ] 取值(推荐)
· 注意:字符索引是左闭右开区间 [ start, end )

>>> s = Series(data=[1,2,3,4],index=list('ABCD'))
>>> s
A    1
B    2
C    3
D    4
dtype: int64
############   索引   ######################
>>> s[0]          #基础索引
1
>>> s.loc["A"]    #字符索引
1
>>> s.iloc[0]     #数字索引
1
#############   切片   ###################
>>> s[0:2]     #基础切片(基础切片不能单个截取)
A    1
B    2
dtype: int64

>>> s.loc["A","C"] # 注意 !!! 这样指要获取最外层的 A 里面的 C 要
想获取 s 里的 A 和 C 这样

>>> s.loc[["A","C"]]  #单个截取(字符索引)
A    1
C    3
dtype: int64
>>>> s.loc["A":"C"]  #区间截取(字符索引)
A    1
B    2
C    3
dtype: int64

>>>> s.iloc[[0,3]]  #单个截取(数字索引)
A    1
D    4
dtype: int64

>>> s.iloc[0:3]  #区间截取(数字索引)
A    1
B    2
C    3
dtype: int64

3、Series的属性和方法

属性

1)形状 shape

2)个数 size

方法

1)查看前面 head()

s.head(n=5)

2)查看后面 tail()

s.head(n=5)

'''
n:取几个,默认为5个
'''
>>> s
A    1
B    2
C    3
D    4
dtype: int64
>>> s.head(2)
A    1
B    2
dtype: int64
>>> s.tail(2)
C    3
D    4
dtype: int64

3)求和

s.sum(axis=None,skipna=None,level=None,numeric_only=None, min_count=0, **kwargs)

'''
对于Series中的求和会将None会被自动转化为NAN,而且在计算时会自动将NAN转化为0
多维数组中的None在求和时会报错
'''
# Series 求和
>>> s2 = Series([1,2,3,None,np.NAN])
>>> s2
0    1.0
1    2.0
2    3.0
3    NaN
4    NaN
dtype: float64
>>> s2.sum()
6.0

# ndarray 求和
>>> nd = np.array([1,2,3,None,np.NAN])
>>> nd
array([1, 2, 3, None, nan], dtype=object)
>>> np.sum()
报错~~

4)isnull()/ notnull()

isnull()
功能:检测None / NaN,为空返回Ture,不为空返回False

>>> s2
0    1.0
1    2.0
2    3.0
3    NaN
4    NaN
dtype: float64

>>> s2.isnull()
0    False
1    False
2    False
3     True
4     True
dtype: bool

notnull()
功能:检测None / NaN,为空返回False,不为空返回Ture

>>> s2
0    1.0
1    2.0
2    3.0
3    NaN
4    NaN
dtype: float64

>>> s2.notnull()
0     True
1     True
2     True
3    False
4    False
dtype: bool

5)name属性

功能:来区分两个相同的数组
注意:在创建的时候设置了才有name属性,如果没有设置,则返回为空

6)unique()去重

>>> s1 = Series(['tom','lili','hehe','tom','lili'])
>>> s1
0     tom
1    lili
2    hehe
3     tom
4    lili
dtype: object

>>> s1.unique()
array(['tom', 'lili', 'hehe'], dtype=object)

4、Series的运算

1)Series的加减乘除

广播机制:给Series对象进行运算

>>> s
A    1
B    2
C    3
D    4
dtype: int64
#注意返回之后不会改变原数据的值
>>> s+1
A    2
B    3
C    4
D    5
dtype: int64

2)Series的运算

s.add(other,fill_value=None, axis=0)

'''
other:另一个Series
fill_value:相加是不对称的地方的NAN以这个值来填充
'''

>>> s1 = Series(data=np.random.randint(1,5,size=5),index=list('abcde'))
>>> s1
a    1
b    1
c    3
d    1
e    2
dtype: int32
>>> s2 = Series(data=np.random.randint(1,5,size=3),index=list('abc'))
>>> s2
a    2
b    3
c    1
dtype: int32

>>> s1.add(s2)      #没有fill_value=0
a    3.0
b    4.0
c    4.0
d    NaN
e    NaN
dtype: float64

>>> s1.add(s2,fill_value=0) #有fill_value=0
a    3.0
b    4.0
c    4.0
d    1.0
e    2.0
dtype: float64

二、DataFrame

DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(多个series共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

行索引:index
列索引:columns
值:values(numpy的二维数组)

1、创建DataFrame

DataFrame(data=None, index=None,columns=None, dtype=None, copy=False)

1)一般创建方法

'''
data:数据
index:行索引(默认为 0,1,2....)
columns:列索引(默认为 0,1,2....)

注意:行索引和列索引要和所创建的数据维度对应!否则报错
'''
# 成绩表
nd = np.random.randint(0,150,size=(5,4))
nd = array([[125,  19,  45,  25],
           [ 62, 128, 139,   2],
           [ 99, 142, 134,  98],
           [  3, 114, 142, 102],
           [ 47, 110,  70, 112]])
index=['张三','李四','王老五','赵六','田七']
columns = ['python','java','c','math']
df = DataFrame(data=nd,index=index,columns=columns)
df

这里写图片描述

2)字典创建方法

话不多说,上图
这里写图片描述

3)通过导入csv文件创建

文件内容:
这里写图片描述

DataFrame创建:
pd.read_csv(“文件路径“)
这里写图片描述
文件导入后会默认添加行索引
疑问:csv文件导入到DataFrame后第一行是否一定是列索引?

2、DataFrame的属性

以上面创建的成绩表为 s 其中的数值不一样

1)values 值

返回值是一个多维数组

s.values
array([[100, 102,  50,  85],
       [ 69, 136,  71, 100],
       [129,  90,  18, 121],
       [149,  87, 143, 129],
       [ 40,  80, 129,  61]])

2)columns 列索引

s.index
Index(['张三', '李四', '王老五', '赵六', '田七'], dtype='object')

3)index 行索引

s.columns
Index(['python', 'java', 'c', 'math'], dtype='object')

4)shape 形状

行叫样本
列叫特征

s.shape
(5, 4)  # 5 个样本,4 个特征

5)query 查询

>>> df1 = DataFrame({'name':['tom','lucy','tom','peppy','lucy'],'age':[12,13,12,11,15]})
>>> df1
        name  age
    0    tom   12
    1   lucy   13
    2    tom   12
    3  peppy   11
    4   lucy   15
>>> df1.query('name=="lucy"')  #查询name是”lucy“的样本
       name  age
    1  lucy   13
    4  lucy   15
>>> df1.query('name=="lucy"&age>14')  #查询name是lucy同时age大于 14的样本
       name  age
    4  lucy   15

3-1、DataFrame的单层索引

以上面创建的成绩表为 s 其中的数值不一样
这里写图片描述

1)对列进行索引与切片

  • 通过类似字典的方式
  • 通过属性的方式
'''
返回值:一个Series对象
'''
s['python']   #通过字典的方式
张三     100
李四      69
王老五    129
赵六     149
田七      40
Name: python, dtype: int32

s.python    #通过属性的方式
张三     100
李四      69
王老五    129
赵六     149
田七      40
Name: python, dtype: int32

2)对行进行索引

  • 使用.loc[ ] 加index来进行行索引
  • 使用.iloc[ ] 加整数来进行行索引
'''
返回值:一个Series对象
'''
s.loc['张三']         #使用.loc[] 索引
python    100
java      102
c          50
math       85
Name: 张三, dtype: int32

s.iloc[1]    #使用.iloc[] 索引
python     69
java      136
c          71
math      100
Name: 李四, dtype: int32

3)对元素进行索引

  • 使用列索引,再进行元素索引
  • 使用行索引,再进行元素索引
  • 使用整数数组形式的索引
  • 取 任意顺序 的 任意元素
#使用列索引,再取元素值
s['python']
s['python'].loc['张三']
s['python'].iloc[0]
100
#使用行索引,再取元素值
s.loc['张三']
s.loc['张三'].loc['python']
s.loc['张三'].iloc[0]
100
#使用整数数组的索引形式取元素值
s.loc['张三','python']    #先行后列
100

#使用整数数组的索引形式取 任意顺序 的 任意元素
s.loc[['张三','李四'],'python']  #将前一部分视为行,后一部分视为列
张三    100
李四     69
Name: python, dtype: int32


4)对元素进行切片

##行列连续切片
s.loc['张三':'李四','python':"c"]
     python java    c
张三   100    102   50
李四    69    136   71

##行列间隔间断切片
s.loc[['张三','李四','李四'],['python',"c","c"]]  #将前一部分视为行,后一部分视为列
python  c   c        
张三  100 50  50
李四  69  71  71
李四  69  71  71

3-2、多层索引数据

1. 创建多层行/列索引

一般情况下
多层行索引的index,columns :indexes,columns
多行列索引的index,columns :features,samples
其他的都基本相同

1)隐式构造(构造Series的多层索引)

最简单的方法是给DataFrame构造函数的index参数传递两个或更多的数组
创建一个Series对象的多层索引

'''
这里的index里的每个元素里的个数必须相同
'''
>>> data = np.random.randint(0,100,size=4)
>>> s1 = Series(data,index=[['期中','期中','期末','期末'],['语文','数学','语文',' 数学']])
>>> s1
期中  语文    68
    数学    73
期末  语文    96
    数学    36
dtype: int32

在多层索引的Series中取值

>>> s1.loc['期中','数学']
73

2)显式构造(直接创建多层索引)

(1)使用数组

pd.MultiIndex.from_arrays(arrays,sortorder=None, names=None)
功能:将数组转化为多层索引

'''
这里的index里的每个元素里的个数必须相同
'''
>>> indexes = pd.MultiIndex.from_arrays([['期中','期中','期中','期末','期末','期末'],['语','数','外','语','数','外']])
>>> columns = ['tom','jack','rose']
>>> data = np.random.randint(0,150,size=(6,3))
>>> DataFrame(data=data,index=indexes,columns=columns)
      tom  jack  rose
期中 语   72    23   10845    21    72124    70   108
期末 语   13   140    45142    96    99147    47    38
(2)使用元祖

pd.MultiIndex.from_tuples(tuples,sortorder=None,names=None)
功能:将元组转化为多层索引

>>> indexes = pd.MultiIndex.from_tuples([('期中','语'),('期中','数'),('期中','外'),('期末','语'),('期末','数'),('期末','外')])
>>> columns = ['tom','jack','rose']
>>> data = np.random.randint(0,150,size=(6,3))
>>> DataFrame(data=data,index=indexes,columns=columns)
      tom  jack  rose
期中 语   55    79    47126   128    3537    79    85
期末 语   27    19     077    34     96    87    32
(3)使用product(乘积)

pd.MultiIndex.from_product(iterables,sortorder=None,names=None)
功能:从多个迭代的笛卡尔积中创建一个多索引
(将传入的多个列表以乘积的形式作索引)

'''
data中的size为(indexes乘积,columns)
'''
>>> indexes = pd.MultiIndex.from_product([['期中','期末'],['语','数','外']])
>>> columns = ['张三','李四']
>>> data = np.random.randint(0,150,size=(6,2))
>>> DataFrame(data=data,index=indexes,columns=columns)
       张三   李四
期中 语   82  10345    218   15
期末 语  140   6652   4150  137

2. 多层索引对象的索引与切片操作

1)Series的索引与切片

(1)索引

常规:

'''
依旧使用Series.loc["字符索引"]
最外层可以取,内层不能使用.loc[]
依旧使用Series.iloc["字符索引"]
数字索引可以在多层索引中使用
'''
>>> s1 = Series([100,90,80,70,60,50],index=pd.MultiIndex.from_product([['期中','期末'],['语','数','外']]))
>>> s1
期中  语    1009080
期末  语     706050
dtype: int64

注意:

>>> s1.loc['语':'外']
Series([], dtype: int64)
>>> s1.loc[['期中','期末']]
期中  语    1009080
期末  语     706050
dtype: int64

2)DataFrame的索引与切片

(1)索引

常规:可以直接使用列名称来进行 列索引 以及 使用loc()对行索引

'''
依旧使用.loc["字符索引"]
最外层可以取,内层不能直接使用.loc[]
依旧使用.iloc["字符索引"]
数字索引可以在多层索引中使用
'''
>>> indexes = pd.MultiIndex.from_product([['期中','期末'],['语','数','外']])
>>> columns = pd.MultiIndex.from_product([['一班','二班'],['01','02','03']])
>>> data = np.random.randint(0,150,size=(6,6))
>>> df1 = DataFrame(data,index=indexes,columns=columns)
>>> df1
       一班             二班
          1    2    3    1   2    3
期中 语   81   21   60   64  148  13126  138  101  129  119  10347   75  141   26  146   33
期末 语   18   55  131  149  118  126124  127   61   16   70  11010   61  141  145  130  128

普通用法

>>> df1['一班']       #对外层的索引获取到的是DataFrame
         1    2    3
期中 语   81   21   6026  138  10147   75  141
期末 语   18   55  131124  127   6110   61  141

>>> df1['一班']['01']   #第二层索引,获取到的是Series对象
期中  语     812647
期末  语     1812410
Name: 01, dtype: int32

iloc[ ] 索引/切片(推荐使用)

>>> df1.iloc[0]   #使用iloc[数字索引]获取,和单层相同
一班  01     81
    02     21
    03     60
二班  01     64
    02    148
    03    131
Name: (期中, 语), dtype: int32

>>> df1.iloc[:,0:2]   #使用iloc,还是类似于二维数组的索引(推荐使用)
       一班
       01   02
期中 语   81   2126  13847   75
期末 语   18   55124  12710   61

.loc[ ]索引/切片(坑深,误入,去上面)

>>> df1.loc["期中",'一班'].loc["语":'数','01':'02']  #比较复杂。
   01   0281   2126  138

3. 索引的堆(stack)

对DataFrame的行和列进行转换,转换后的数据不改变,标题层级不会改变。
先指定一个(DataFrame) df

'''
level:堆的层级由内向外分别是 0,1,2....
    默认为 -1 最内层索引转换为另一个索引
'''
>>> data=np.random.randint(0,150,size=(2,8))
>>> index=["rose","jack"]
>>> columns=pd.MultiIndex.from_product([["期中","期末"],["一模","二模"],["语文"," 英语"]])
>>> df = DataFrame(data,index,columns)
>>> df
       期中                    期末
       一模          二模      一模        二模
       语文   英语   语文  英语 语文   英语   语文   英语
rose   130    100    112  10    3     130   120    136
jack   139    128    57   94    2     26    144    120

1) df.stack(level=-1, dropna=True)

功能:将列堆转到行堆
官方翻译:将指定的级别从列堆到索引堆。

>>> df.stack()           #默认将最内层的列索引转换为行行索引
          期中          期末
          一模   二模   一模   二模
rose 英语  100    10    130   136
     语文  130    112    3    120
jack 英语  128    94     26   120
     语文  139    57     2    144
>>> df.stack(1)   #将从内向外的第二个列转换为行索引
          期中         期末
          英语   语文   英语   语文
rose 一模  100    130   130    3
     二模   10    112   136    120
jack 一模  128    139    26    2
     二模   94     57   120    144
>>>

>>> df.stack([0,1])   #还可以传入列表,将指定的行索引一起转换
              英语   语文
rose 期中 一模  100  130
          二模   10  112
     期末  一模  130    3
          二模  136  120
jack 期中  一模  128  139
          二模   94   57
     期末  一模   26    2
          二模  120  144
>>>

2) df.unstack(level=-1, dropna=True)

与 df.stack 的用法一模一样,区别是将行索引转换为列索引。
转换后的数据不变

4. 聚合操作(sum,max,min…)

  • ndarray是对整个数据的操作,df默认是对列操作
  • 通过指定axis,可以对行操作

ndrray的聚合操作:

>>> data = np.random.randint(0,5,size=(5,5))
>>> data
array([[2, 3, 3, 2, 0],
       [3, 0, 4, 3, 2],
       [3, 4, 4, 0, 2],
       [4, 3, 0, 4, 1],
       [1, 0, 4, 0, 0]])
>>> data.sum()  #求和
52
>>> data.mean()  #求平均值
2.08
>>> data.min()  #求最小值
0
>>> data.max()  #求最大值
4

DataFrame的聚合操作

'''
axis:指定 行/列  (默认为 None(0) 列, 1 行)
'''
>>> data = np.random.randint(0,5,size=(5,5))
>>> columns = list('ABCDE')
>>> df = DataFrame(data=data,columns=columns)
>>> df
   A  B  C  D  E
0  4  2  2  1  0
1  3  0  2  3  0
2  4  3  3  3  4
3  4  0  4  0  4
4  4  2  2  2  1

>>> df.sum()  #默认对列求和
A    19
B     7
C    13
D     9
E     9
dtype: int64

>>> df.sum(axis=1)  #对行求和
0     9
1     8
2    17
3    12
4    11
dtype: int64

4、DataFrame的运算

1)DataFrame与数字的加减乘除

广播机制:给DataFrame对象进行的每个元素进行运算
这里写图片描述

2)DataFrame之间的运算

Python Operator Pandas Method(s)
+ add()
- sub(), subtract()
* mul(), multiply()
/ truediv(), div(), divide()
// floordiv()
% mod()
** pow()

- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN
s.add(other,axis=’columns’, fill_value=None)

'''
other:于s相加的表格
axis:以哪个索引为基础进行运算(默认为columns,列索引,index,行索引)
fill_value:用来替代NaN
'''

3)Series与DataFrame之间的运算

  • 使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)

  • 使用pandas操作函数:

    axis=0:以列为单位操作(参数必须是列),对所有列都有效。
    axis=1:以行为单位操作(参数必须是行),对所有行都有效。
    

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

5、DataFrame的值处理

1)值的筛选/过滤

这里写图片描述

2)isnull()

功能:
用来判断元素的值,是nan就是True 不是就是False
一般与any()两用,用来判断行/列里的值是否有空值

df.isnull().any(axis=1)  #来判断 列 中是否有nan/None,True代表有,False则代表没有
a     True
b     True
c    False
d    False
e     True
dtype: bool

df.isnull().any(axis=0)  #来判断 行 中是否有nan/None,True代表有,False则代表没有
0     True
1     True
2    False
3     True
4    False
dtype: bool

3)notnull()

是nan就是False不是就是Ture(和上面的相反)

4)dropna()删除空值

df.dropna(axis=0, how=’any’)
功能:删除nan

'''
how:['any', 'all']
    默认为"any" :删除所有包含nan的行或列
         'all' :删除行或列中所有元素都是nan的 行或列
axis:轴线 默认为 0 横 , 1 竖
'''

5)fillna()填充空值

df.fillna(value=None,method=None,axis=None, inplace=False, limit=None,inplace=False, **kwargs)
功能:对数据中的nan进行填充

'''
value:可以指定填充的值
method:可以从表里找一些值来填充(没有找到的还是NaN)
    {'backfill', 'bfill', 'pad', 'ffill', None}
    None:使用value参数填充
    bfill:将后面的值填充进去
    ffill:将前面的值填充进去
    backfill:---
    pad:
axis:填充是沿着那个轴线,默认是None,以列来找。1,以行来找
limit:限制连续填充nan的个数
inplace:是否替换原数据表

'''

6、pandas的拼接操作

pandas的拼接分为两种:

  • 级联:pd.concat, pd.append (没有重复数据)
  • 合并:pd.merge, pd.join (有重复数据)

1) 使用pd.concat()级联

pd.concat(objs, axis=0, join=’outer’, join_axes=None, ignore_index=False, names=None, sort=None)
功能:拼接两个DataFrame数据
返回值:返回一个新的DataFrame对象

'''
objs:要级联的对象
axis:以哪个轴拼接 默认为0,以纵向拼接
join:控制拼接的方式
    {'inner', 'outer'}, default 'outer'
    'inner'
join_axes:可以设定按照哪些索引对象拼接
ignore_index:忽略原来的索引 重新分配索 默认False,不忽略原来的索引
sort:拼接后对索引排序
'''

匹配拼接

这里写图片描述
这里写图片描述

不匹配拼接

形状不匹配拼接时会发出警告,此时只需在函数cancat()中加入参数 sort=Ture 就OK

这里写图片描述
1、默认将对不上的列补NaN填充
这里写图片描述
2、axis 拼接方向 (0 纵向, 1 横向)
这里写图片描述
3、join 拼接方式 (outer 外联, inner 内联)
这里写图片描述
4、join_axes 按指定的拼接,这里的参数填索引对象
1)用已有的列进行拼接
这里写图片描述
2)指定列进行拼接
需要使用pd.index([‘指定的索引1’,’指定的索引2’…])生成索引对象
这里写图片描述

2) 使用append()函数在下面拼接

这里写图片描述

7、使用pd.merge()合并

功能:merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并

pd.merge(left,right,how=’inner’,on=None,left_on=None,right_on=None,left_index=False,right_index=False, sort=False,suffixes=(‘_x’,’_y’), copy=True,indicator=False, validate=None)

'''
left, right:要合并的对象
how:怎么融合数据
    {'left', 'right', 'outer', 'inner'}, default 'inner'
    'inner':两个都有的都对应上才会进行拼接
    'outer':对所有行/列都会进行合并
    'left':以左边的为准
    'right':以右边的为准
on:指定用哪一行或多行来拼接
left_on:左边根据那一列合并
right_on:右边根据那一列合并
left_index:
right_index:
sort:
suffixes:对两个相同的列进行区分
indicator:
validate:
'''

读取exc文件
pd.read_excel(‘文件路径’,sheet_name=表名)

1)一对一合并

主要研究 how 参数的变化
这里写图片描述
这里写图片描述
这里写图片描述

2)多对一合并

这里写图片描述
这里写图片描述

3)多对多合并

这里写图片描述

一般在实际业务中会指定列来拼接
suffixes 用来区分两表中同名的列
这里写图片描述
on 用来同时满足两列相同的情况
这里写图片描述

三、pandas数据处理

1、删除重复元素

重复样本

在实际操作中有的样本(行)的特征(列)完全一样这就是重复样本,在有些情况下需要对这些样本进行处理

样本数据(其中就有重复样本)

>>> data = [[100,100,100],[90,90,88],[100,100,100],[90,90,87],[100,100,100]]
>>> columns = ['python','c','java']
>>> index = list('ABCDE')
>>> df = DataFrame(data=data,index=index,columns=columns)
>>> df
   python    c  java
A     100  100   100
B      90   90    88
C     100  100   100
D      90   90    87
E     100  100   100

1)df.duplicated(subset=None,keep=’first’)

'''
keep: {'first', 'last', False}
    默认为 first 不算第一个
          last  不算最后一个
          False 全部都算
'''
>>> df.duplicated()  #默认keep=“first” 
A    False       --第一个不算重复的(last同理)
B    False
C     True       --重复返回True
D    False       --不重复返回False
E     True
dtype: bool
>>> df.duplicated(keep=False) 
A     True        --第一个也算重复样本
B    False
C     True
D    False
E     True        --最后一个也算重复样本
dtype: bool

2)df.drop_duplicates(subset=None,keep=’first’,inplace=False)

功能:删除重复的样本

'''
keep: {'first', 'last', False}
    默认为 first 不算第一个
          last  不算最后一个
          False 全部都算
inplace:修改缓存中的DataFrame(原来的变量也会被改变)     
'''

keep为默认值

>>> df.drop_duplicates()  #默认为“first”
   python    c  java
A     100  100   100     --第一个重复样本被保留(last同理)
B      90   90    88
D      90   90    87

keep=False

>>> df.drop_duplicates(keep=False)  #所有的重复元素都被删除
   python   c  java    
B      90  90    88
D      90  90    87

2. 映射(替换)

映射的含义:创建一个对应关系列表,把values元素和一个特定的标签或者字符串绑定(类似于字典)

1) replace()函数:替换元素

s1.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method=’pad’)

'''
to_replace:要替换的值(旧值)
    [字符串,列表,字典]
    字符串:需要value也传替换成的参数
    列表:需要value也传替换成的参数(需要一一对应)
    字典:to_replace={100:'满分','没有的':'也不会报错'} 可以传入没有的值,用来过滤可能会出现的值

value:替换成的值(新值)
limit:限制替换的个数
method:当to_replace和value不传参时,将数据中的NaN以前面的或后面的替换
        当to_replace传参,value不传参时,会将to_replace指定的值用前面的或后面的值替换
        {'pad', 'ffill', 'bfill', `None`}
        pad,ffill:从后面补齐
        bfill:从前面补齐
'''

(1)Series替换

样本数据


>>> s1 = Series(data = [100,'peppa',np.nan,'beijing'])
>>> s1
0        100
1      peppa
2        NaN
3    beijing
dtype: object

单值替换

>>> s1.replace(to_replace='beijing',value='西安')
0      100
1    peppa
2      NaN
3       西安     #将样本中的beijing替换为西安
dtype: object

列表替换
两个列表里的值数量需要统一

>>> s1.replace(to_replace=[100,np.nan],value=['满分','缺考'])
0         满分
1      peppa
2         缺考
3    beijing
dtype: object

字典替换

可以放入很多没有的值 没有的值就不会替换了 但是也不会报错
应用:可以用来做过滤器

>>> # 字典替换(推荐) 支持单值,多值替换
>>> s1.replace(to_replace={100:'满分',np.nan:'缺考','beijing':'西安','没有的':'也不会报错'})

0       满分
1    peppa
2       缺考
3       西安
dtype: object

(2)DataFrame替换操作

样本数据 数据下载

df = pd.read_excel("./data/data.xls",sheet_name=0)
df

    0     1       2      3         4
A   甲    NaN     NaN    NaN     Beijing
B   乙   69.0    142.0   29      Beijing
C   丙   111.0   7.0      2      Beijing
D   丁   139.0   19.0    125     shanghai
E   戊   12.0    66.0    Beijing shanghai

单值替换
指定替换表中的某些值

df.replace(to_replace='Beijing',value='西安')  #将某个值全部替换成新值
    0    1        2      3      4
A   甲   NaN     NaN     NaN    西安
B   乙   69.0    142.0   29     西安
C   丙   111.0   7.0      2     西安
D   丁   139.0   19.0    125   shanghai
E   戊   12.0    66.0    西安  shanghai
列替换

指定替换表中的某列中的某些值
(若想替换多列中的值,多写两遍吧)

df.replace(to_replace={4:'Beijing'},value='西安')   #设置to_replace中的参数
    0    1        2      3         4
A   甲   NaN      NaN    NaN      西安
B   乙   69.0    142.0   29       西安
C   丙   111.0   7.0      2       西安
D   丁   139.0   19.0    125     shanghai
E   戊   12.0    66.0    Beijing shanghai
列表替换

列表以可以传不存在的值用来过滤

df.replace(to_replace=['甲','乙',np.nan],value=[1,2,'空值'])  #两个参数中的列表中元素数量需要一致

    0     1    2     3         4
A   1   空值  空值  空值      Beijing
B   2    69   142   29       Beijing
C   丙   111   7     2       Beijing
D   丁   139   19    125     shanghai
E   戊   12    66    Beijing shanghai
字典替换(推荐)

可以用来用作过滤器

df.replace(to_replace={'甲':1,'乙':2,np.nan:'空值','Beijing':'西安','不存在的也可以放这里':'不会报错'})
    0    1    2     3       4
A   1   空值  空值   空值   西安
B   2    69   142    29    西安
C   丙   111   7      2    西安
D   丁   139   19    125  shanghai
E   戊   12    66    西安  shanghai

2) map()函数:映射元素

3) rename()函数:替换索引名

3. 使用聚合操作对数据异常值检测和过滤

4. 排序

5.随机抽样

6.数据分类处理

文中所用到的数据(可下载)
可点击下载

猜你喜欢

转载自blog.csdn.net/PyRookie/article/details/81507198