社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python 数据清洗篇

Python技术博文 • 9 年前 • 882 次点击  

前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作,
数据清洗一直是数据分析中极为重要的一个环节。本篇主要演示:python 数据清洗的数据合并、转换、过滤、排序.

数据合并

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

import numpy as npimport 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中提取样本。



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/RRS8MFHjVK
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3210