利用Python进行数据分析_Pandas_基础_2
Posted 木东
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python进行数据分析_Pandas_基础_2相关的知识,希望对你有一定的参考价值。
申明:本系列文章是自己在学习《利用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 d0 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 d0 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 02.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_基础_2的主要内容,如果未能解决你的问题,请参考以下文章
利用Python进行数据分析_Pandas_数据加载存储与文件格式
《利用python进行数据分析》之《第二章引言》学习笔记_2