美文网首页
Pandas_3 处理缺失值、数据透视表以及apply的用法

Pandas_3 处理缺失值、数据透视表以及apply的用法

作者: 幻想的双鱼座 | 来源:发表于2019-03-09 19:04 被阅读0次

    1.处理缺失值

    Pandas使用NaN(Not a Number)来表示缺失值

    1.1判断是否存在缺失值以及缺失值的个数

    判断:data.isnull()pd.isnull(data),若只判断某一列时,data.isnull(data['column'])pd.isnull(data["column"]),推荐第二种;

    求缺失值的个数:这块一直不懂,贴上代码,望以后能想明白吧(衰)

    age = data["Age"]
    age_is_null = pd.isnull(data['Age'])
    age_null_true = age[age_is_null]
    age_null_count = len(age_null_true)
    print(age_null_count)
    

    1.2 过滤缺失值

    data.dropna()-------- dropna 在默认情况下会删除包含缺失值的行;

    当然,在你传入参数axis = 1时,可以删除包含缺失值的列;

    当传入参数how = "all"时,dropna是删除所有值为NA的行;

    1.3 补全过滤值

    你有时候可能需要以多种方式来补全缺失值,而并非是过滤掉缺失值,那在大多数情况下,主要使用 fillna 方法来补全缺失值。调用 fillna 时,可以用一个常数来代替缺失值,例如:

    data.fillna(1)/ data.fillna(0) ----------使用常数1或0 来替代;

    当然你也可以为不同的列设定不同的值,这是可以传入一个字典,例如:

    data.fillna({"column1":1,"column2":0}) --------- 对column1列使用1来替代缺失值,而cloumn2列使用0来替代;

    fillna 更厉害的地方在于可以用于插值,通过传入参数 method = "ffill" 或 method = "bfill" ,分别是向前插值和向后插值,默认是 'ffill'; 不仅如此,你也可以用Series的平均值或中位数来填充缺失值,例如:

    data.fillna(data["Age"].mean())

    总结:

    检查过滤值 过滤缺失值 补全缺失值
    pd.isnull(data) data.dropna() data.fillna()

    2.数据透视表------pivot_table

    最简单的透视表必须有一个数据帧和一个索引。在本例中,我们将使用“Pclass”列作为我们的索引

    pd.pivot_table(data,index = 'Pclass')

    此外,你也可以设置多个索引,例如:

    pd.pivot_table(data,index = ["Pclass","Sex"])

    如果我只想显示‘Age’和‘Fare’列,其他列于我而言是没用的,这时可以使用values来显示我们只关心的列

    pd.pivot_table(data,index = ["Pclass","Sex"],values = ['Age','Fare'])

    上面列表中的数值代表了相应索引下的平均值(默认的),当然,我们自已也可以设置其他的聚合值,例如,求和或计数,这时需要使用聚合参数 aggfunc,同时需要导入numpy

    pd.pivot_table(data,index = ['Pclass','Sex'],values = ['Age','Fare'],aggfunc = np.sum)

    进行到这一步,我发现我只想对'Fare'列进行求和,而'Age'列,我想要求平均值,那该怎么办呢?

    这时你需要向aggfunc传递一个字典,告诉pandas哪一列求平均,哪一列是求和

    pd.pivot_table(data,index = ['Pclass','Sex'],values = ['Age','Fare'],aggfunc = {'Age':np.mean,'Fare':np.sum})

    不过,如果我想查看一些总和数据呢?“margins=True”就可以为我们实现这种功能

    pd.pivot_table(data,index = ['Pclass','Sex'],values = ['Age','Fare'],aggfunc = {'Age':np.mean,'Fare':np.sum},margins=True)

    3. apply的用法

    用途:

    当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并将元组或者字典中的参数按照顺序传递给参数.

    apply的中文意思是应用,那在python中作为函数我想也是作为同样的意思,其函数语法为apply(function,args),其中funcion为定义的函数,args为需向function中传入的一系列参数

    apply的返回值就是function的返回值。

    python中的DataFrame作为一个元组,其行或列就作为函数的参数。

    下面举例说明

    import numpy as np
    import pandas as pd
    data = pd.DataFrame(np.random.randn(4,4),columns = list('abcd'),index = ['ind1','ind2','ind3','ind4'])
    data
    

    结果为:

                a           b           c           d
    ind1    0.177938    -0.877354   1.158941    -0.825953
    ind2    -0.506917   -0.060584   -0.445731   -0.860620
    ind3    -0.985207   0.708244    0.151892    0.721318
    ind4    -1.214316   -0.844392   -1.283502   -1.329589
    
    t1 = data.apply(lambda x:x.max()-x.min())
    t1
    a    1.392254
    b    1.585598
    c    2.442443
    d    2.050907
    dtype: float64
    

    或使用参数axis = 1,对行进行操作

    t2 = data.apply(lambda x:x.max()-x.min(),axis = 1)
    t2
    ind1    2.036294
    ind2    0.800036
    ind3    1.706525
    ind4    0.485197
    dtype: float64
    

    若想要作用于数据中的每一个元素,则需要使用函数 applymap
    将DataFrame中的每个元素保留两位有效数字

    f = lambda x: '%.2f' % x
    data.applymap(f)
              a       b       c       d
    ind1    0.18    -0.88   1.16    -0.83
    ind2    -0.51   -0.06   -0.45   -0.86
    ind3    -0.99   0.71    0.15    0.72
    ind4    -1.21   -0.84   -1.28   -1.33
    

    这里之所以使用applymap是因为,Series有一个元素级函数的map方法。而dataframe只有applymap.

    t3 = data['a'].map(lambda x:'%.1f' %x)
    t3
    ind1     0.2
    ind2    -0.5
    ind3    -1.0
    ind4    -1.2
    Name: a, dtype: object
    

    相关文章

      网友评论

          本文标题:Pandas_3 处理缺失值、数据透视表以及apply的用法

          本文链接:https://www.haomeiwen.com/subject/rtqepqtx.html