这篇文章主要介绍了 python 数据清洗之数据合并、转换、过滤、排序的相关资料, 需要的朋友可以参考下
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
前面我们用 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))
结果为:
- 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))
结果为:
这里的用法类似于 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.phperz.com/article/17/0312/324805.html