欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python数据分析之pandas基本功能讲解

程序员文章站 2022-04-05 08:37:14
pandas的基本功能 重新索引 不存在的索引都用同一个值填充: obj.reindex(['a','b','c',...
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

Python数据分析之pandas基本功能讲解

Python数据分析之pandas基本功能讲解

函数应用和映射

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.这两天写了个小爬虫,这两天脑子有点乱,所以写的乱七八糟的,小错误也犯了一堆。整理一下思路和代码,过两天发出来。实际写的时候发现之前的知识又生疏了。。。好尴尬,学的时候的感觉就是:对,不这么写怎么写,这格式就应该是这样的,这么写就能达到这种意思。 但是自己实际去两手空空的写的时候就是懵的。。。老是网上找资料,找格式啥的。估计还是用的太少,大家也应该学的时候多练多写,不会的多找资料。然后找个身边的能做的小的项目来练手,就能发现自己的差距了,继续努力!