一:移除重复数据

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数据分析之:数据清理,转换,合并,重塑(二)的更多相关文章

  1. python数据分析笔记——数据加载与整理]

    [ python数据分析笔记——数据加载与整理] https://mp.weixin.qq.com/s?__biz=MjM5MDM3Nzg0NA==&mid=2651588899&id ...

  2. 小白学 Python 数据分析(17):Matplotlib(二)基础操作

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  3. 小白学 Python 数据分析(3):Pandas (二)数据结构 Series

    在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析( ...

  4. 利用Python进行数据分析_Pandas_数据清理、转换、合并、重塑

    1 合并数据集 pandas.merge pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, le ...

  5. Python数据分析_Pandas01_数据框的创建和选取

    主要内容: 创建数据表 查看数据表 数据表索引.选取部分数据 通过标签选取.loc 多重索引选取 位置选取.iloc 布尔索引 Object Creation 新建数据 用list建series序列 ...

  6. Python数据分析--------numpy数据打乱

    一.shuffle函数: import numpy.random def shuffleData(data): np.random.shufflr(data) cols=data.shape[1] X ...

  7. Python数据分析:pandas玩转Excel (二)

    1 对Excel文件的操作 方法一: 使用xlrd库或者xlwt库进行对excel表格的操作读与写: 方法二: pandas库同样支持excel的读写操作:且更加简便. 2 pd.read_excel ...

  8. python数据分析之pandas库的DataFrame应用二

    本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 ''' Created on 2016-8-1 ...

  9. Python数据分析Pandas库之熊猫(10分钟二)

    pandas 10分钟教程(二) 重点发法 分组 groupby('列名') groupby(['列名1','列名2',.........]) 分组的步骤 (Splitting) 按照一些规则将数据分 ...

  10. python数据分析工具包(2)——Numpy(二)

    上一篇文章简单地介绍了numpy的一些基本数据类型,以及生成数组和矩阵的操作.下面我们来看一下矩阵的基本运算.在线性代数中,常见的矩阵运算包括,计算行列式.求逆矩阵.矩阵的秩等.下面我们来一一实现. ...

随机推荐

  1. 【转】【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)

    [Stackoverflow好问题]去掉烦人的“!=null"(判空语句) 问题 为了避免空指针调用,我们经常会看到这样的语句   ...if (someobject != null) { ...

  2. Zlib编译

    转自原文 编译和使用zlib 由于要编译Cesium Terrain Build,其中不仅需要gdal,还用到了zlib,所以此时不得不总结一下Zlib的编译之道了. 在windows下用到zlib库 ...

  3. 【IntelliJ IDEA】Debug调试的使用记录

    Debug调试是否能行云流水的使用,是鉴定你会不会使用一个IDE的最基本的标准. 今天再这里把Idea的debug使用流程走一遍. ================================== ...

  4. xamarin.ios 本地通知推送

    由于ios10版本以后UILocalNotification被标为弃用了,所以要添加新的本地通知推送功能,下面提供一些代码参考. 一.先在AppDelegate.cs上注册本地通知推送功能. publ ...

  5. Redis 架构设计

    1.设计层面 (1) 存储小而热的数据 (2) 结合业务数据特点,正确使用内存类型 (3) 冷.热数据分离 2.架构层面 (1) 提前做好容量(内存)规划 (2) 结合持久化模式优劣正确使用,一般建议 ...

  6. selenium用java找到表格某一行某一列中含有特定文字的某个元素

    html部分代码如下: <tbody> <tr class="odd"> <td>1609</td> <td>-YOUK ...

  7. java怎样将一个List传入Oracle存储过程

    java怎样将一个List传入Oracle存储过程.样例例如以下: 数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tables_array AS VARRAY(10 ...

  8. 线程安全的概念和Synchronized(读书笔记)

         并行程序开发的一大关注重点就是线程安全,一般来说,程序并行化为了获取更多的执行效率,但前提是,高效率不能以牺牲正确性为代价,线程安全就是并行程序的根本和根基.volatile并不能真正保证线 ...

  9. mongoDb学习以及spring管理 (包括百度云配置)

    1.windows下的安装http://www.cnblogs.com/liuzhiying/p/5915741.html 2.慕课网学习单机操作mongoDb 赋权限:http://blog.csd ...

  10. IOS Audio开发集合

    打算每天抽出一点时间学习音频方面的知识,在此做下汇总: 1. 多媒体层预览  根据结构,明确学习内容.