zoukankan      html  css  js  c++  java
  • python 数据清洗之数据合并、转换、过滤、排序

    前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作,
    数据清洗一直是数据分析中极为重要的一个环节。

    数据合并

    在pandas中可以通过merge对数据进行合并操作。

    import numpy as np
    import pandas as pd
    data1 = pd.DataFrame({'level':['a','b','c','d'],
                     'numeber':[1,3,5,7]})
    
    data2=pd.DataFrame({'level':['a','b','c','e'],
                     'numeber':[2,3,6,10]})
    print(data1)
    

    结果为:

    print(data2)
    

    结果为:

    print(pd.merge(data1,data2))
    

    结果为:

    可以看到data1和data2中用于相同标签的字段显示,而其他字段则被舍弃,这相当于SQL中做inner join连接操作。
    此外还有outer,ringt,left等连接方式,用关键词how的进行表示。

    data3 = pd.DataFrame({'level1':['a','b','c','d'],
                     'numeber1':[1,3,5,7]})
    data4=pd.DataFrame({'level2':['a','b','c','e'],
                     'numeber2':[2,3,6,10]})
    print(pd.merge(data3,data4,left_on='level1',right_on='level2'))
    

    结果为:

    两个数据框中如果列名不同的情况下,我们可以通过指定letf_on 和right_on两个参数把数据连接在一起

    print(pd.merge(data3,data4,left_on='level1',right_on='level2',how='left'))
    

    结果为:

    其他详细参数说明

    重叠数据合并

    有时候我们会遇到重叠数据需要进行合并处理,此时可以用comebine_first函数。

     data3 = pd.DataFrame({'level':['a','b','c','d'],
                     'numeber1':[1,3,5,np.nan]})
     data4=pd.DataFrame({'level':['a','b','c','e'],
                     'numeber2':[2,np.nan,6,10]})
     print(data3.combine_first(data4))
    

    结果为:

    可以看到相同标签下的内容优先显示data3的内容,如果一个数据框中的某一个数据是缺失的,此时另外一个数据框中的元素就会补上
    这里的用法类似于np.where(isnull(a),b,a)

    数据重塑和轴向旋转

    这个内容我们在上一篇pandas文章有提到过。数据重塑主要使用reshape函数,旋转主要使用unstack和stack两个函数。

    data=pd.DataFrame(np.arange(12).reshape(3,4),
                  columns=['a','b','c','d'],
                  index=['wang','li','zhang'])
    print(data)
    

    结果为:

    print(data.unstack())
    

    结果为:

    数据转换

    删除重复行数据

    data=pd.DataFrame({'a':[1,3,3,4],
                  'b':[1,3,3,5]})
    print(data)
    

    结果为:

    print(data.duplicated())
    

    结果为:

    可以看出第三行是重复第二行的数据所以,显示结果为True
    另外用drop_duplicates方法可以去除重复行

    print(data.drop_duplicates())
    

    结果为:

    替换值

    除了使用我们上一篇文章中提到的fillna的方法外,还可以用replace方法,而且更简单快捷

    data=pd.DataFrame({'a':[1,3,3,4],
                  'b':[1,3,3,5]})
    print(data.replace(1,2))
    

    结果为:

    多个数据一起换

    print(data.replace([1,4],np.nan))
    

    数据分段

    data=[11,15,18,20,25,26,27,24]
    bins=[15,20,25]
    print(data)
    print(pd.cut(data,bins))
    

    结果为:
    [11, 15, 18, 20, 25, 26, 27, 24]
    [NaN, NaN, (15, 20], (15, 20], (20, 25], NaN, NaN, (20, 25]]
    Categories (2, object): [(15, 20] < (20, 25]]

    可以看出分段后的结果,不在分段内的数据显示为na值,其他则显示数据所在的分段。

    print(pd.cut(data,bins).labels)
    

    结果为:
    [-1 -1 0 0 1 -1 -1 1]
    显示所在分段排序标签

    print(pd.cut(data,bins).levels)
    

    结果为:
    Index(['(15, 20]', '(20, 25]'], dtype='object')
    显示所以分段标签

    print(value_counts(pd.cut(data,bins)))
    

    结果为:

    显示每个分段值得个数

    此外还有一个qcut的函数可以对数据进行4分位切割,用法和cut类似。

    排列和采样

    我们知道排序的方法有好几个,比如sort,order,rank等函数都能对数据进行排序
    现在要说的这个是对数据进行随机排序(permutation)

    data=np.random.permutation(5)
    print(data)
    

    结果为:
    [1 0 4 2 3]
    这里的peemutation函数对0-4的数据进行随机排序的结果。
    也可以对数据进行采样

    df=pd.DataFrame(np.arange(12).reshape(4,3))
    samp=np.random.permutation(3)
    print(df)
    

    结果为:

    print(samp)
    结果为:
    [1 0 2]

    print(df.take(samp))
    结果为:

    这里使用take的结果是,按照samp的顺序从df中提取样本。

  • 相关阅读:
    Vue路由机制
    谷歌浏览器打不开应用商店的解决方法
    Vue报错——Component template should contain exactly one root element. If you are using vif on multiple elements, use velseif to chain them instead.
    Vue.js学习之——安装
    Vue使用axios无法读取data的解决办法
    关于localstorage存储JSON对象的问题
    2013年整体计划
    个人喜欢的警语收集
    Linux防火墙的关闭和开启
    Flex修改title 转载
  • 原文地址:https://www.cnblogs.com/wkslearner/p/5928888.html
Copyright © 2011-2022 走看看