申明:本系列文章是自己在学习《利用Python进行数据分析》这本书的过程中,为了方便后期自己巩固知识而整理。

第一 重新索引

Series的reindex方法

In [15]: obj = Series([3,2,5,7,6,9,0,1,4,8],index=['a','b','c','d','e','f','g',
...: 'h','i','j']) In [16]: obj1 = obj.reindex(['a','b','c','d','e','f','g','h','i','j','k']) In [17]: obj1
Out[17]:
a 3.0
b 2.0
c 5.0
d 7.0
e 6.0
f 9.0
g 0.0
h 1.0
i 4.0
j 8.0
k NaN
dtype: float64

新索引值当前值缺失,则需要插值

前向值填充method=’ffill’,最后索引j对应的值来填充

In [19]: obj1 = obj.reindex(['a','b','c','d','e','f','g','h','i','j','k'],metho
...: d='ffill') In [20]: obj1
Out[20]:
a 3
b 2
c 5
d 7
e 6
f 9
g 0
h 1
i 4
j 8
k 8
dtype: int64

前向值搬运method=’pad’,最后索引j对应的值来填充

In [23]: obj1 = obj.reindex(['a','b','c','d','e','f','g','h','i','j','k'],metho
...: d='pad') In [24]: obj1
Out[24]:
a 3
b 2
c 5
d 7
e 6
f 9
g 0
h 1
i 4
j 8
k 8
dtype: int64

后向值填充method=’bfill’,最后索引j的后面的索引对应的值来填充,j的后一个位置为NaN的空行

In [62]: obj2 = obj.reindex(['a','b','c','d','e','f','g','k','h','i','j'],metho
     ...: d='bfill')

In [63]: obj2
Out[63]:
a    3.0
b    2.0
c    5.0
d    7.0
e    6.0
f    9.0
g    0.0
k    NaN
h    1.0
i    4.0
j    8.0
dtype: float64

后向值搬运method=’backfill’,最后索引j的后面的索引对应的值来填充,j的后一个位置为NaN的空行

In [64]: obj2 = obj.reindex(['a','b','c','d','e','f','g','k','h','i','j'],metho
...: d='backfill') In [65]: obj2
Out[65]:
a 3.0
b 2.0
c 5.0
d 7.0
e 6.0
f 9.0
g 0.0
k NaN
h 1.0
i 4.0
j 8.0
dtype: float64

DataFrame的reindex方法

修改(行)索引、列,或两个都修改。

引入一个序列,则重新索引行,如下:

In [86]: data = {'class':['语文','数学','英语'],'score':[120,130,140]}

In [87]: frame = DataFrame(data)

In [88]: frame
Out[88]:
class score
0 语文 120
1 数学 130
2 英语 140 In [89]: frame2 = frame.reindex([0,1,2,3]) In [90]: frame2
Out[90]:
class score
0 语文 120.0
1 数学 130.0
2 英语 140.0
3 NaN NaN

行、列 都修改

In [94]: frame3 = frame.reindex(index=[11,22,33],columns = ['a','b','c','d'])

In [95]: frame3
Out[95]:
a b c d
11 NaN NaN NaN NaN
22 NaN NaN NaN NaN
33 NaN NaN NaN NaN

reindex的参数如下:

第二 删除指定轴(索引)上的项

Series

In [112]: obj = Series([1,2,3,4],index=['a','b','c','d'])

In [113]: obj
Out[113]:
a 1
b 2
c 3
d 4
dtype: int64 In [114]: obj1 = obj.drop('c') In [115]: obj1
Out[115]:
a 1
b 2
d 4
dtype: int64

DataFrame

删除单索引行

In [109]: frame
Out[109]:
class score
0 语文 120
1 数学 130
2 英语 140 In [110]: obj = frame.drop(0) In [111]: obj
Out[111]:
class score
1 数学 130
2 英语 140

删除多索引行

In [119]: frame
Out[119]:
class score
0 语文 120
1 数学 130
2 英语 140 In [120]: frame.drop([1,2])
Out[120]:
class score
0 语文 120

删除多索引行(带axis)

In [130]: frame
Out[130]:
class score
0 语文 120
1 数学 130
2 英语 140 In [131]: frame.drop([1,2],axis=0)
Out[131]:
class score
0 语文 120

删除列(columns)(带axis)

In [135]: frame
Out[135]:
class score
0 语文 120
1 数学 130
2 英语 140 In [136]: frame.drop(['class'],axis=1)
Out[136]:
score
0 120
1 130
2 140

其中,axis=0,表示行,axis=1,表示列

第三 索引、选取与过滤

Series

In [1]: from pandas import Series,DataFrame

In [2]: obj = Series([1,2,3,4],index=['a','b','c','d'])

In [3]: obj
Out[3]:
a 1
b 2
c 3
d 4
dtype: int64 In [4]: obj[1]
Out[4]: 2 In [5]: obj['c']
Out[5]: 3 In [6]: obj[1:2]
Out[6]:
b 2
dtype: int64 In [7]: obj[2:4]
Out[7]:
c 3
d 4
dtype: int64

DataFrame

In [13]: from pandas import DataFrame,Series

In [14]: data = DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns
...: =['aa','bb','cc']) In [15]: data
Out[15]:
aa bb cc
a 1 2 3
b 4 5 6
c 7 8 9

索引方式一

In [16]: data['bb']
Out[16]:
a 2
b 5
c 8
Name: bb, dtype: int64

索引方式二

In [19]: data[:2]
Out[19]:
aa bb cc
a 1 2 3
b 4 5 6

索引方式三

In [20]: data[data<4]
Out[20]:
aa bb cc
a 1.0 2.0 3.0
b NaN NaN NaN
c NaN NaN NaN In [21]: data[data<4]=0 In [22]: data
Out[22]:
aa bb cc
a 0 0 0
b 4 5 6
c 7 8 9

索引方式四

In [24]: data.ix[:2,['aa','cc']]
Out[24]:
aa cc
a 0 0
b 4 6

第四 算术运算与数据对齐

Series

In [36]: a1
Out[36]:
a 1
b 2
c 3
d 4
e 5
dtype: int64 In [37]: a2
Out[37]:
a 2
b 3
c 4
f 5
g 6
dtype: int64

a1+a2

In [38]: a1+a2
Out[38]:
a 3.0
b 5.0
c 7.0
d NaN
e NaN
f NaN
g NaN
dtype: float64

DataFrame

In [47]: import numpy as np

In [48]: b1 = DataFrame(np.arange(12.).reshape((3,4)),columns=list('abcd'))

In [49]: b1
Out[49]:
a b c d
0 0.0 1.0 2.0 3.0
1 4.0 5.0 6.0 7.0
2 8.0 9.0 10.0 11.0 In [50]: b2 = DataFrame(np.arange(20.).reshape((4,5)),columns=list('abcde')) In [51]: b2
Out[51]:
a b c d e
0 0.0 1.0 2.0 3.0 4.0
1 5.0 6.0 7.0 8.0 9.0
2 10.0 11.0 12.0 13.0 14.0
3 15.0 16.0 17.0 18.0 19.0 In [52]: b1+b2
Out[52]:
a b c d e
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN

对NaN进行指定值填充

In [53]: b1.sub(b2,fill_value=0)
Out[53]:
a b c d e
0 0.0 0.0 0.0 0.0 -4.0
1 -1.0 -1.0 -1.0 -1.0 -9.0
2 -2.0 -2.0 -2.0 -2.0 -14.0
3 -15.0 -16.0 -17.0 -18.0 -19.0

DataFrame与Series运算

In [101]: b1
Out[101]:
a b c d

0 0.0 1.0 2.0 3.0

1  4.0  5.0   6.0   7.0
2 8.0 9.0 10.0 11.0 In [102]: b1.ix[0]
Out[102]:

a 0.0 b 1.0 c 2.0 d 3.0

Name: 0, dtype: float64

In [103]: b1-b1.ix[0]
Out[103]:
a b c d

0 0.0 0.0 0.0 0.0

1  4.0  4.0  4.0  4.0
2 8.0 8.0 8.0 8.0

第五 函数应用于映射

In [111]: b1
Out[111]:
a b c d
0 0.0 1.0 2.0 3.0
1 4.0 5.0 6.0 7.0
2 8.0 9.0 10.0 11.0 In [112]: f = lambda x:x.max()-x.min() In [113]: b1.apply(f)
Out[113]:
a 8.0
b 8.0
c 8.0
d 8.0
dtype: float64

找出DataFrame中每列的最大值和最小值

In [1]: import numpy as np

In [2]: from pandas import DataFrame,Series

In [3]: import pandas as pd

In [4]: b1 = DataFrame(np.arange(12.).reshape((3,4)),columns=list('abcd'))

In [5]: b1
Out[5]:
a b c d
0 0.0 1.0 2.0 3.0
1 4.0 5.0 6.0 7.0
2 8.0 9.0 10.0 11.0 In [6]: def f(x):
...: return Series([x.min(),x.max()],index=['min','max'])
...: In [7]: b1.apply(f)
Out[7]:
a b c d
min 0.0 1.0 2.0 3.0
max 8.0 9.0 10.0 11.0

第六 排序和排名

排序

Series

obj.sort_index()

In [19]: obj = Series([4,np.nan,7,np.nan,-3,2])

In [20]: obj
Out[20]:
0 4.0
1 NaN
2 7.0
3 NaN
4 -3.0
5 2.0
dtype: float64 In [21]: obj.sort_index()
Out[21]:
0 4.0
1 NaN
2 7.0
3 NaN
4 -3.0
5 2.0
dtype: float64 In [22]: obj.sort_values()
Out[22]:
4 -3.0
5 2.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64

DataFrame

默认升序

data.sort_index()

data.sort_index(axis=1)

data.sort_index(axis=1,ascending=False)

排名

Series

排名会有一个排名值,从1开始。

rank()是平均排名,也就是会出现同排名值的情况。

但是可以通过如下method选项去破坏平级关系:

In [38]: obj = Series([3,4,2,1,5,7,9,0])

In [39]: obj
Out[39]:
0 3
1 4
2 2
3 1
4 5
5 7
6 9
7 0
dtype: int64 In [40]: obj.rank()
Out[40]:
0 4.0
1 5.0
2 3.0
3 2.0
4 6.0
5 7.0
6 8.0
7 1.0
dtype: float64 In [41]: obj.rank(method='first')
Out[41]:
0 4.0
1 5.0
2 3.0
3 2.0
4 6.0
5 7.0
6 8.0
7 1.0
dtype: float64 In [42]: obj.rank(ascending=False,method='min')
Out[42]:
0 5.0
1 4.0
2 6.0
3 7.0
4 3.0
5 2.0
6 1.0
7 8.0
dtype: float64

DataFrame

In [44]: data = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1],'c':[-2,5,6,7]})

In [45]: data
Out[45]:
a b c
0 0 4 -2
1 1 7 5
2 0 -3 6
3 1 2 7 In [46]: data.rank(axis=1)
Out[46]:
a b c
0

2.0 3.0 1.0

1  1.0  3.0  2.0
2 2.0 1.0 3.0
3 1.0 2.0 3.0

axis表示行,axis=1表示第一行进行排名,0、4、-2,默认从小到大升序,应该是-2、0、4,所以0的排名值应该是2.0;4的排名值是3.0;-2的排名值是1.0

第七 带有重复值的轴索引

通过is_unique属性可以判断索引是否唯一。

利用Python进行数据分析_Pandas_基本功能的更多相关文章

  1. 利用Python进行数据分析_Pandas_数据加载、存储与文件格式

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 1 pandas读取文件的解析函数 read_csv 读取带分隔符的数据,默认 ...

  2. 利用Python进行数据分析_Pandas_层次化索引

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...

  3. 利用Python进行数据分析_Pandas_处理缺失数据

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 1 读取excel数据 import pandas as pd import ...

  4. 利用Python进行数据分析_Pandas_汇总和计算描述统计

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. In [1]: import numpy as np In [2]: impo ...

  5. 利用Python进行数据分析_Pandas_数据结构

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 首先,需要导入pandas库的Series和DataFrame In [21] ...

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

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

  7. 利用Python进行数据分析_Pandas_绘图和可视化_Matplotlib

    1 认识Figure和Subplot import matplotlib.pyplot as plt matplotlib的图像都位于Figure对象中 fg = plt.figure() 通过add ...

  8. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

  9. 利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

随机推荐

  1. Redis批量删除缓存数据

    背景: 在使用redis中,经常会遇到批量删除缓存的情况,但是对于在客户端中,如果一个一个的删除key,则需要较长时间及相对麻烦,可以使用以下命令,批量删除缓存. 本地批量删除KEY: ./redis ...

  2. ansible 问题记录(2)

    普通用户执行ansible,但是在远程需要root权限,这个时候执行ansible命令报如下错误: 经分析是由于sudo的时候,普通用户没有在sudoer文件 2.在playbook里面使用sudo认 ...

  3. Qt 的插件制作

    首先会遇到一些插件使用的问题: 插件加载的时候出现乱码 qrc:/main.qml:20: Error: Qt.createQmlObject(): failed to create object: ...

  4. [Ubuntu] A start job is running for...interfaces

    CPU:RK3288 系统:Linux 移植 Ubuntu 16.04 到嵌入式平台,如果以太网有问题,在这里会耗时大约5分钟 开机后可以修改 Ubuntu 配置来缩短时间 打开下面的文件,可以看到最 ...

  5. VUE -- iview table 组件 中使用 upload组件 上传组件 on render 事件不会触发问题

    碰到的问题是: upload 组件在 on中写的监听事件不会被触发 在 props 中来监听:==>

  6. 遇到多个构造器参数时要考虑用构建器 builder 模式 JavaBean 线程安全

    effective java p9 JavaBeans模式阻止了把类做成不可变的可能,这需要程序员付出额外的努力来确保它的线程安全.

  7. this.getClass()和super.getClass()得到的是同一个类

    今天dubug代码时发现this.getClass()和super.getClass()得到的竟然是同一个类,都是当前类. 遍访网络资料得出: getClass()不受this和super影响,而是有 ...

  8. wordpress插件开发从创建一个新的菜单开始

    创建插件的目的 1.我们为什么要创建一个插件? IT界有一个知名的论调叫做不要造重复的轮子,如果有可能的话,你应该尽可能的从现有的网络资源上选择一个已有的插件来使用,而不是重新创造一个.它耗费的精力很 ...

  9. VUE知识点小记

    .if里面不能用import方式导入,只能用require方式引入 判断长度大于0 getIssues (vue, data) { let label = '' ) { label = `+label ...

  10. Android:系统自定义鼠标样式切换

    一.APP通过View修改鼠标样式 app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法修改为自定义图片: getWindow().getDecorView ...