python数据分析之:数据清理,转换,合并,重塑(二)
一:移除重复数据
DataFrame经常出现重复行,就像下面的这样
In [7]: data=DataFrame({'k1':['one']*3+['two']*4,'k2':[1,1,2,3,3,4,4]})
In [8]: data
Out[8]:
k1 k2
0 one 1
1 one 1
2 one 2
3 two 3
4 two 3
5 two 4
6 two 4
duplicated方法可以判断出每行是否重复了
In [9]: data.duplicated()
Out[9]:
0 False
1 True
2 False
3 False
4 True
5 False
6 True
dtype: bool
既然可以判断重复,那么我们也可以丢弃这些重复项
In [11]: data.drop_duplicates()
Out[11]:
k1 k2
0 one 1
2 one 2
3 two 3
5 two 4
这种丢弃是针对的全部列,也可以指定某一列
In [12]: data.drop_duplicates('k1')
Out[12]:
k1 k2
0 one 1
3 two 3
二利用函数或映射进行数据转换
在对数据集进行转换的时候,我们希望对列中的值进行一个转换。转换可以用到map方法
In [13]: data=DataFrame({'food':['bacon','pulled pork','bacon','Pastrami','corne
...: d beef','Bacon','pastrami','honey ham','nova lox'],'ounces':[4,3,12,6,7
...: .5,8,3,5,6]})
In [14]: data
Out[14]:
food ounces
0 bacon 4.0
1 pulled pork 3.0
2 bacon 12.0
3 Pastrami 6.0
4 corned beef 7.5
5 Bacon 8.0
6 pastrami 3.0
7 honey ham 5.0
8 nova lox 6.0
对于上述的各种肉的类型,如果希望指明从那些动物上获取的,那么就要写一个肉到动物的映射。首先完成一个映射表
In [15]: meat_to_animal={'bacon':'pig','pulled pork':'pig','pastrami':'ciw','cor
...: ned beef':'cow','honey ham':'pig','nova lox':'salmon'}
再进行映射,首先是将肉类全部转换成小写字母,然后再和meat_to_animal进行映射
In [16]: data['animal']=data['food'].map(str.lower).map(meat_to_animal)
In [17]: data
Out[17]:
food ounces animal
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 ciw
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 ciw
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
三 替换值
前面在将填充数据的时候用到了fillna的方法。但是其实使用replace方法更简单。
比如下面的这个数据,-000是无效的数据。通过replace的方法直接替换掉
In [18]: data=Series([1,-000,2,3,4])
In [19]: data
Out[19]:
0 1
1 0
2 2
3 3
4 4
dtype: int64
In [20]: data.replace(-000,np.nan)
Out[20]:
0 1.0
1 NaN
2 2.0
3 3.0
4 4.0
dtype: float64
四 离散化和面元划分
为了分析,经常需要将数据拆分成不同的数据,也就是离散化
In [21]: ages=[20,22,25,27,21,23,37,31,61,45,41,32]
In [22]: bins=[18,25,35,60,100]
In [23]: cats=pd.cut(ages,bins)
In [24]: cats
Out[24]:
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
得到的数据是各自的区间。但是数据呈现这样的方式观测起来很不方便,可以给每个区间加上标签这样更直观些
In [25]: group_name=['youth','youngAdult','MiddleAged','Senior']
In [27]: cats=pd.cut(ages,bins,labels=group_name)
In [28]: cats
Out[28]:
[youth, youth, youth, youngAdult, youth, ..., youngAdult, Senior, MiddleAged, MiddleAged, youngAdult]
Length: 12
Categories (4, object): [youth < youngAdult < MiddleAged < Senior]
如果cut传入的是面元的数量而不是确切的面元边界,则会根据最小值和最大值计算等长面元。比如下面的这个数据,将一些均匀的数据分成了4组
In [29]: data=np.random.rand(20)
In [30]: pd.cut(data,4,precision=2)
Out[30]:
[(0.77, 0.97], (0.15, 0.36], (0.15, 0.36], (0.15, 0.36], (0.77, 0.97], ..., (0.56, 0.77], (0.15, 0.36], (0.15, 0.36], (0.77, 0.97], (0.77, 0.97]]
Length: 20
Categories (4, interval[float64]): [(0.15, 0.36] < (0.36, 0.56] < (0.56, 0.77] < (0.77, 0.97]]
In [32]: group=['first','second','third','fourth']
In [33]: pd.cut(data,4,precision=2,labels=group)
Out[33]:
[fourth, first, first, first, fourth, ..., third, first, first, fourth, fourth]
Length: 20
Categories (4, object): [first < second < third < fourth]
五 检测和过滤异常值
比如下面的4列具有正态分布的数据。通过describe可以得到数据的各项值,比如期望,方差,4分位数等
In [35]: data=DataFrame(np.random.randn(1000,4))
In [36]: data.describe()
Out[36]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.067684 0.067924 0.025598 -0.002298
std 0.998035 0.992106 1.006835 0.996794
min -3.428254 -3.548824 -3.184377 -3.745356
25% -0.774890 -0.591841 -0.641675 -0.644144
50% -0.116401 0.101143 0.002073 -0.013611
75% 0.616366 0.780282 0.680391 0.654328
max 3.366626 2.653656 3.260383 3.927528
六 排列和随机采样
利用numpy.random.permutation函数可以轻松实现对Series和DataFrame的列的重排工作
In [37]: df=DataFrame(np.arange(5*4).reshape(5,4))
In [38]: df
Out[38]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
4 16 17 18 19
In [41]: sampler
Out[41]: array([1, 0, 2, 3, 4])
In [39]: sampler=np.random.permutation(5)
可以看到根据sampler提供的行索引顺序对数据进行了重排
In [40]: df.take(sampler)
Out[40]:
0 1 2 3
1 4 5 6 7
0 0 1 2 3
2 8 9 10 11
3 12 13 14 15
4 16 17 18 19
python数据分析之:数据清理,转换,合并,重塑(二)的更多相关文章
- python数据分析笔记——数据加载与整理]
[ python数据分析笔记——数据加载与整理] https://mp.weixin.qq.com/s?__biz=MjM5MDM3Nzg0NA==&mid=2651588899&id ...
- 小白学 Python 数据分析(17):Matplotlib(二)基础操作
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(3):Pandas (二)数据结构 Series
在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析( ...
- 利用Python进行数据分析_Pandas_数据清理、转换、合并、重塑
1 合并数据集 pandas.merge pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, le ...
- Python数据分析_Pandas01_数据框的创建和选取
主要内容: 创建数据表 查看数据表 数据表索引.选取部分数据 通过标签选取.loc 多重索引选取 位置选取.iloc 布尔索引 Object Creation 新建数据 用list建series序列 ...
- Python数据分析--------numpy数据打乱
一.shuffle函数: import numpy.random def shuffleData(data): np.random.shufflr(data) cols=data.shape[1] X ...
- Python数据分析:pandas玩转Excel (二)
1 对Excel文件的操作 方法一: 使用xlrd库或者xlwt库进行对excel表格的操作读与写: 方法二: pandas库同样支持excel的读写操作:且更加简便. 2 pd.read_excel ...
- python数据分析之pandas库的DataFrame应用二
本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 ''' Created on 2016-8-1 ...
- Python数据分析Pandas库之熊猫(10分钟二)
pandas 10分钟教程(二) 重点发法 分组 groupby('列名') groupby(['列名1','列名2',.........]) 分组的步骤 (Splitting) 按照一些规则将数据分 ...
- python数据分析工具包(2)——Numpy(二)
上一篇文章简单地介绍了numpy的一些基本数据类型,以及生成数组和矩阵的操作.下面我们来看一下矩阵的基本运算.在线性代数中,常见的矩阵运算包括,计算行列式.求逆矩阵.矩阵的秩等.下面我们来一一实现. ...
随机推荐
- 某考试 T3 C
找不着原题了. 原题大概就是给你一条直线上n个点需要被覆盖的最小次数和m条需要花费1的线段的左右端点和1条[1,n]的每次花费为t的大线段. 问最小花费使得所有点的覆盖数都达到最小覆盖数. 感觉这个函 ...
- iOS 给三方日历加上农历
首先创建一个农历文件 LunarCalendar.h // // LunarCalendar.h // Hnair4iPhone // // Created by yingkong1987 on 13 ...
- 在红米note4上实现自动安装软件
因为要做自动化测试,需要对已发布的包进行回归手测,这个时候需要手动安装APK,但是红米会弹出继续安装的按钮,手点一次比较烦,想自动点"继续安装"按钮! 感谢先行者们的分享 本文参考 ...
- Drawable 添加过滤色,改变图片颜色
/** * 更改图片颜色 * @param drawable * @param color * @return */ public Drawable getDrawable(Drawable draw ...
- ThinkPHP3.1 模板布局
ThinkPHP的模板引擎内置了布局模板功能支持,可以方便的实现模板布局以及布局嵌套功能.有三种布局模板的支持方式: 第一种方式:全局配置方式 这种方式仅需在项目配置文件中添加相关的布局模板配置,就可 ...
- su、sudo、sudo su、sudo -i的用法和区别
sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码.不过有时间限制,Ubuntu默认为一次时长15分钟.su : 切换到某某用户模式,提 ...
- 转:java的各个拓展类库的推荐方案
from: 链接:https://www.zhihu.com/question/21142149/answer/109854408 Java是世界上最强大的编程语言之一,很多开发人员和大型企业都偏爱J ...
- curses.h头文件不存在解决办法
sudo apt-get install libncurses5-dev安装,系统自带库文件一般在/usr/include下面,这个是安装curses.h的 conio不是c语言标准库,也不是posi ...
- PropertyGrid—属性类别排序
属性默认按照字母顺序排序,有时,我们想要按自定义的顺序排序 这个工具类可以把每个属性类别里的属性排序,但是不能把属性类别排序. 为属性类添加属性:[TypeConverter(typeof(Prope ...
- iOS SDK具体解释之UIDevice(系统版本号,设备型号...)
原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 blog.csdn.net/column/details/huangwenchen ...