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
参数 | 说明 |
---|---|
index | 用作索引的新序列。既可以是Index实例,也可以是其他序列型的Python数据结构。Index会被完全使用,就像没有任何复制一样 |
method | 插值(填充)方式 |
fill_value | 在重新索引的过程中,需要引入缺失值时使用的替代值 |
limit | 前向或后向填充时的最大填充量 |
level | 在Multilndex的指定级别上匹配简单索引,否则选取其子集 |
copy | 默认为True,无论如何都复制;如果为False,则新旧相等就不复制 |
总结下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
[图片上传失败...(image-a9f529-1513230768125)]
[图片上传失败...(image-d253d7-1513230768125)]
函数应用和映射
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.这两天写了个小爬虫,这两天脑子有点乱,所以写的乱七八糟的,小错误也犯了一堆。整理一下思路和代码,过两天发出来。实际写的时候发现之前的知识又生疏了...好尴尬,学的时候的感觉就是:对,不这么写怎么写,这格式就应该是这样的,这么写就能达到这种意思。 但是自己实际去两手空空的写的时候就是懵的...老是网上找资料,找格式啥的。估计还是用的太少,大家也应该学的时候多练多写,不会的多找资料。然后找个身边的能做的小的项目来练手,就能发现自己的差距了,继续努力!
个人微信公众号:BrainZou
网友评论