Python数据分析之pandas基本功能讲解
不存在的索引都用同一个值填充:
obj.reindex(['a','b','c','d','e'],fill_value=0) out: a -5.3 b 7.2 C 3.6 d 4.5 e 0.0 #如果没有fill_value则不存在的索引用NaN缺失值引入。
对于有序索引,range(6)或者[‘a’,’b’,’c’,’d’,’e’,’f’]。
用前向值填充:method =‘ffill’或者method = ‘pad’ 前面没有则NaN
用后向值填充:method = ‘bfill’ 或者 method = ‘backfill’ 后面没有则NaN
In [84]:obj3 = Series(['blue','purple','yellow'],index=[o,2,4]) In [85]:obj3.reindex(range(6),method='ffill') 0ut[85]: 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow
上面是Series上的重新索引,DataFrame上也很相似。只传入一个序列,则会重新索引行,使用columns可重新索引列。也可以通时都重新索引,但插值只能按行应用。
In[92]:frame.reindex(index=['a','b','c,'d'],method='ffil1', columns=states) 0ut[92]: Texas Utah California a 1 NaN 2 b 1 NaN 2 #b这一行本来不存在 都用上一行的填充了 C 4 NaN 5 d 7 NaN 8
简单的做法是使用ix如:
In[93]:frame.ix[['a','b','c','d'],states] 0ut[93]: Texas Utah California a 1 NaN 2 b NaN NaN NaN C 4 NaN 5 d 7 NaN 8
总结下reindex的参数:
参数 说明 index 用作索引的新序列。既可以是Index实例,也可以是其他序列型的Python数据结构。Index会被完全使用,就像没有任何复制一样 method 插值(填充)方式 fill_value 在重新索引的过程中,需要引入缺失值时使用的替代值 limit 前向或后向填充时的最大填充量 level 在Multilndex的指定级别上匹配简单索引,否则选取其子集 copy 默认为True,无论如何都复制;如果为False,则新旧相等就不复制 丢弃指定轴上的项obj.drop([‘a’,’c’])
data.drop([‘Colorado’,’Ohio’]) #默认0轴 即行索引
data.drop(‘two’,axis = 1)#指明1轴 即列
索引,选取和过滤Series索引:obj[2:4](2和3) obj[[‘b’,’a’,’d’]]
obj[obj<2](可以把值小于2的都选出来)
但是利用标签的切片运算有一定的不同,它的末端是包含的:
obj['b':'c'] out:b 1 c 2
DataFrame索引:
In [112]:data = DataFrame(np.arange(16).reshape((4,4)), index=[ohio','Colorado',‘Utah',‘New York'], columns=['one','two',‘three',‘four]) In[113]:data 0ut[113]: one two three four 0hio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 In [115]:data[['three',‘one']] 0ut[115]: three one Ohio 2 o Colorado 6 4 Utah 10 8 New York 14 12 #但是通过切片和布尔数组 选取的是行!!! In [116]:data[:2] 0ut[116]: one two three four 0hio 0 1 2 3 Colorado 4 5 6 7 In[117]:data[data['three']>5] 0ut[117]: one two three four Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15
另外一种通过data<5这种布尔型的结果。
In [118]:data<5 out[118]: one two three four Ohio True True True True Colorado True False False False Utah False False False False New York False False False False In[119]:data[data<5]=o In[120]:data 0ut[120]: one two three four ohio o o o o Colorado 0 5 6 7 Utah 8 9 10 11 New York 12 13 14 15
感觉像不像之前的ndarray?
arr=np.arange(10) arr<5 out:array([ True,True,Irue,True,True,False,False,False,False,False],dtype=bool) arr[arr <5]=5 out:array([5,5,5,5,5,5,6,7,8,9])
专门的索引字段ix用来选取行和列的子集。
In[122]:data.ix[['Colorado','Utah'],[3,0,1]] 0ut[122]: four one two Colorado 7 0 5 Utah 11 8 9
In [125]:data.ix[data.three>5,:3] 0ut[125]: one two three Colorado 0 5 6 Utah 8 9 10 New York 12 13 14函数应用和映射
NumPy的ufuncs操作pandas对象:
np.abs(frame)#对每个值都取绝对值
apply可以把函数用到各列或各行所形成的一维数组上:
f = lambda x: x.max() - x.min() frame.apply(f)#取每列最大值与最小值的差值 frame.apply(f,axis=1)#取每行最大值与最小值的差值 def f(x): return Series([x.min(),x.max()],index=['min','max']) frame.apply(f) out: b d e min -0.555730 0.281746 -1.296221 max 1.246435 1.965781 1.393406
还有此外,元素级的Python函数也是可以用的。假如你想得到frame中各个浮点值的格式化字符串,使用applymap即可:
In[166]:format=lambda x:'%.2f'%x In[167]:frame.applymap(format) 0ut[167]: b d e Utah -0.20 0.48 -0.52 Ohio -0.56 1.97 1.39 Texas 0.09 0.28 0.77 0regon 1.25 1.01 -1.30 之所以叫做applymap,是因为Series有一个用于应用元素级函数的map方法: In[168]:frame['e'].map(format) 0ut[168]: Utah -0.52 0hio 1.39 Texas 0.77 0regon -1.30 Name:e
总结:大部分还是pandas对Series,df的重新索引,以及索引和用函数选取你要的数据。
ps.这两天写了个小爬虫,这两天脑子有点乱,所以写的乱七八糟的,小错误也犯了一堆。整理一下思路和代码,过两天发出来。实际写的时候发现之前的知识又生疏了。。。好尴尬,学的时候的感觉就是:对,不这么写怎么写,这格式就应该是这样的,这么写就能达到这种意思。 但是自己实际去两手空空的写的时候就是懵的。。。老是网上找资料,找格式啥的。估计还是用的太少,大家也应该学的时候多练多写,不会的多找资料。然后找个身边的能做的小的项目来练手,就能发现自己的差距了,继续努力!
上一篇: 黑莓Passport预订破20万
下一篇: 黑莓不走寻常路:拟每年推出一款奇葩手机