利用python进行数据分析-06-pandas-基本功能
1、重新索引
obj = pd.Series([4.5,7.2,-5.3,3.6],index = ['d','b','a','c']) obj Out[41]: d 4.5 b 7.2 a -5.3 c 3.6 dtype: float64 obj2 = obj.reindex(['a','b','c','d','e']) obj2 Out[43]: a -5.3 b 7.2 c 3.6 d 4.5 e NaN dtype: float64 obj.reindex(['a','b','c','d','e'],fill_value = 0) Out[44]: a -5.3 b 7.2 c 3.6 d 4.5 e 0.0 dtype: float64
可以利用reindex进行重新索引,其中如果没有索引将会进行缺失值进行填充。其中可以以fill_value进行默认赋值
对于已经确认的Series,可以通过ffill进行向前填充:
obj3 = pd.Series(['blue','purple','yellow'],index = [0,2,4]) obj3.reindex(range(6),method = 'ffill') Out[50]: 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow dtype: object
ffill 或 pad 前向填充(或搬运)值
bfill 或 backfill 后向填充(或搬运)值
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California']) #reshape 重新将数组调整成m*n矩阵的格式 frame Out[55]: Ohio Texas California a 0 1 2 c 3 4 5 d 6 7 8 feame2 = frame.reindex(['a','b','c','d']) feame2 Out[57]: Ohio Texas California a 0 1 2 b NaN NaN NaN c 3 4 5 d 6 7 8
重新索引用reindex:
state = ['Texas','Utah','California'] frame.reindex(index = ['a','b','c','d'],method = 'ffill',columns = state) Out[65]: Texas Utah California a 1 NaN 2 b 1 NaN 2 c 4 NaN 5 d 7 NaN 8frame.ix[['a','b','c','d'],state] #采用ix标签索引功能,从新索引将会更加简单 Out[66]: Texas Utah California a 1 NaN 2 b NaN NaN NaN c 4 NaN 5 d 7 NaN 8
2、丢弃指定轴上的项
drop方法返回的是一个在指定轴上的删除了制定值得新对象:
obj =pd.Series(np.arange(5.),index = ['a','b','c','d','e']) new_obj = obj.drop('c') new_obj Out[69]: a 0 b 1 d 3 e 4 dtype: float64 obj.drop(['d','c']) Out[70]: a 0 b 1 e 4 dtype: float64
3、索引、选取和过滤
obj = pd.Series(np.arange(4.0),index = ['a','b','c','d']) obj Out[72]: a 0 b 1 c 2 d 3 dtype: float64 obj[2:4] Out[73]: c 2 d 3 dtype: float64 obj[1:2] Out[74]: b 1 dtype: float64
利用标签的切片是运算和普通的python切片运算是不一样的,其末端是包含的(inclusive):
obj['b':'c'] Out[76]: b 1 c 2 dtype: float64
利用索引字段ix进行索引选择:
data Out[4]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 data.ix['Colorado',['two','three']] Out[5]: two 5 three 6 Name: Colorado, dtype: int32 data.ix[['Colorado','Utah'],[3,0,1]] Out[6]: four one two Colorado 7 4 5 Utah 11 8 9 data.ix[2] Out[7]: one 8 two 9 three 10 four 11 Name: Utah, dtype: int32 data.ix[:'Utah','two'] Out[8]: Ohio 1 Colorado 5 Utah 9 Name: two, dtype: int32 data.ix[data.three > 5,:3] Out[9]: one two three Colorado 4 5 6 Utah 8 9 10 New York 12 13 14
4、算数运算和数据对齐
对不同索引的对象进行算数运算,如果对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集
s1 = pd.Series([7.3,-2.5,3.4,1.5],index = ['a','c','d','e']) s2 = pd.Series([-2.1,3.6,-1.5,4,3.1],index = ['a','c','e','f','g']) s1 Out[12]: a 7.3 c -2.5 d 3.4 e 1.5 dtype: float64 s2 Out[13]: a -2.1 c 3.6 e -1.5 f 4.0 g 3.1 dtype: float64 s1+s2 Out[14]: a 5.2 c 1.1 d NaN e 0.0 f NaN g NaN dtype: float64
自动的数据对齐操作在不重叠的所引处引入了NA值,缺失值会在算数值中传播。
两个数值进行运算时,如果其中一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值(比如0)
df1 = pd.DataFrame(np.arange(12.).reshape((3,4)),columns = list('abcd')) #可进行list创建数组 df2 = pd.DataFrame(np.arange(20.).reshape((4,5)),columns = list('abcde')) df1 Out[18]: a b c d 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 df2 Out[19]: a b c d e 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 3 15 16 17 18 19 df1.add(df2,fill_value = 0) Out[20]: a b c d e 0 0 2 4 6 4 1 9 11 13 15 9 2 18 20 22 24 14 3 15 16 17 18 19
在对Series或DataFrame重新索引时,也可以指定一个填充值
df1.reindex(columns = df2.columns,fill_value = 0) Out[21]: a b c d e 0 0 1 2 3 0 1 4 5 6 7 0 2 8 9 10 11 0
add 用于加法 sub用于减法 div用于除法 mul用于乘法
5、用于DataFrame和Series之间的运算
arr = np.arange(12.).reshape((3,4)) arr Out[23]: array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]) arr[0] Out[24]: array([ 0., 1., 2., 3.]) arr-arr[0] Out[25]: array([[ 0., 0., 0., 0.], [ 4., 4., 4., 4.], [ 8., 8., 8., 8.]])
6、函数应用和映射
frame Out[30]: b d e Utah 0.126339 -1.371416 0.971039 Ohio 0.325697 -1.110609 1.177894 Texas 0.114226 -1.359126 -0.323779 OREGON 1.015949 0.904341 1.275054 np.abs(frame) Out[31]: b d e Utah 0.126339 1.371416 0.971039 Ohio 0.325697 1.110609 1.177894 Texas 0.114226 1.359126 0.323779 OREGON 1.015949 0.904341 1.275054 f=lambda x: x.max() - x.min()
#lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。如f表示极差函数。
frame.apply(f) Out[33]: b 0.901723 d 2.275758 e 1.598833 dtype: float64 frame.apply(f,axis =1) Out[34]: Utah 2.342456 Ohio 2.288503 Texas 1.473352 OREGON 0.370713 dtype: float64
传递给apply的值还可以返回由多个值组成的Series:
def f(x): return pd.Series([x.min(),x.max()],index = ['min','max']) frame.apply(f) Out[40]: b d e min 0.114226 -1.371416 -0.323779 max 1.015949 0.904341 1.275054
元素级的python函数也是可以使用的,假如frame中的各个浮点值的格式化字符串,可使用applymap即可:
format = lambda x: '%.2f' % x frame.applymap(format) Out[42]: b d e Utah 0.13 -1.37 0.97 Ohio 0.33 -1.11 1.18 Texas 0.11 -1.36 -0.32 OREGON 1.02 0.90 1.28
之所以叫做applymap,是因为Series有一个应用元素级函数的map方法:
frame['e'].map(format) Out[44]: Utah 0.97 Ohio 1.18 Texas -0.32 OREGON 1.28 Name: e, dtype: object
7、排序和排名
DataFrame对轴索引进行排序:sort_index() x.sort_index(axis =1,ascending = False)
Series对值进行排序:order()
Dataframe对值进行排序:sort_index(by = [‘a’,’b’]) #对a,b列进行排序,
rank排序:
Series:会增设一个排名值
默认情况下,rank是通过“为各组分配一个平均排名”的方式来破坏平级关系的。
两个4共同排名第四,两则均取4.5,
obj = pd.Series([7,-5,7,4,2,0,4]) obj.rank() Out[50]: 0 6.5 1 1.0 2 6.5 3 4.5 4 3.0 5 2.0 6 4.5 dtype: float64
也可以根据在原数据中出现的顺序来给出排名:
obj.rank(method = 'first') #可知原数据中-5是第一小的,故索引为1的位置显示为1,其中索引为3的值4排第四,索引为6的值4排第五 Out[52]: 0 6 1 1 2 7 3 4 4 3 5 2 6 5 dtype: float64
8、带有重复值的轴索引
obj = pd.Series(range(5),index = ['a','a','b','b','c']) obj Out[54]: a 0 a 1 b 2 b 3 c 4 dtype: int32 obj.index.is_unique #is_unique 进行检查索引是否唯一 Out[55]: False obj['a'] #如果索引对应多个值,则返回一个Series,若对应一个值,则返回一个标量值 Out[56]: a 0 a 1 dtype: int32
对DataFrame的行进行索引时也是如此。