设为首页 加入收藏

TOP

Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档(二)
2017-09-30 16:46:58 】 浏览:238
Tags:Python array list dataframe 索引 切片 操作 2016年 07月 19日 文档
诀就是:“顾头不顾尾”。假如你的第一个索引是“0”,那么你可以省略不写。
当Python使用切片语法时候就会产生切片对象。扩展的切片语法允许对不同的索引切片操作包括步进切片、多维切片和省略切片。多维切片的语法是sequence[start1:end1,start2:end2],或使用省略号,sequence[…,start1:end1]。切片对象也可以由内建函数slice()。

二维数组的选取:
首先我们前面说了 多维数组切片的语法是 sequence[start1:end1,start2:end2,…,startn:endn] 我们用一个3X3的二维数组来演示一下选取问题:

>>> b  = np.arange(9).reshape(3,3)
>>> b
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

数组下标是从0开始,对于数组a,只需要用a[m,n]选取各数组中的元素。对应的位置如下

[(0,0),(0,1),(0,2)]
[(1,0),(1,1),(1,2)]
[(2,0),(2,1),(2,2)]

对于切片二维的语法是sequence[start1:end1,start2:end2]

>>> b[1:,:2]
#先从第一个逗号分割输出从1开使行 就是  [(1,0),(1,1),(1,2)]
# 和 [(2,0),(2,1),(2,2)]
#拿第一个逗号分割的数据,在进行第二维操作,到2结束的列,输入如下
array([[3, 4],
       [6, 7]])

基于对步进切片的理解后,二维 和 三维都同样的好理解,而且没有步进那么复杂
同样可以对切片的元素进行复制操作

>>> b[1:,:2] = 1 #广播赋值
>>> b
array([[0, 1, 2],
       [1, 1, 5],
       [1, 1, 8]])
>>> b[1:,:2].shape
(2L, 2L)
>>> b[1:,:2] = np.arange(2,6).reshape(2,2) #对应赋值
>>> b
array([[0, 1, 2],
       [2, 3, 5],
       [4, 5, 8]])

三维的同理,就是sequence[start1:end1,start2:end2]。取单值的时候,a[l,m,n]。
省略的表示[:]取第n维的所有元素。

>>> b=np.arange(24).reshape(2,3,4)
>>> b[1,]
array([[12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]])
>>> b[1,2]
array([20, 21, 22, 23])
>>> b[1,2,3]
23
>>> b[1,:,3]
array([15, 19, 23])
>>>  

讲到这里,对于pandas的dataframe 我们就可以使用 iloc 把一个df 看作多维数组进行切片

>>> b  = np.arange(9).reshape(3,3)
>>> df = pd.DataFrame(b)
>>> df.iloc[1,2]
5
>>> df.iloc[1:,2]
1    5
2    8
Name: 2, dtype: int32
>>> df.iloc[1:,:2]
   0  1
1  3  4
2  6  7
>>> df.iloc[1:,:2] = 1#同样的广播赋值
>>> df
   0  1  2
0  0  1  2
1  1  1  5
2  1  1  8

(妈妈在用不用担心我的df切片了)

讲一下loc,loc 是根据index 和columns 进行选择的,在df赋值操作中,还是比较推荐这种赋值方式。

当 index 和 columns 为数值的时候 且是从0 开始我们对比一下:

>>> b = np.arange(36).reshape(6,6)
>>> b
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])
>>> df = pd.DataFrame(b)
>>> df
    0   1   2   3   4   5
0   0   1   2   3   4   5
1   6   7   8   9  10  11
2  12  13  14  15  16  17
3  18  19  20  21  22  23
4  24  25  26  27  28  29
5  30  31  32  33  34  35
>>> df.loc[1:,:2]
    0   1   2
1   6   7   8
2  12  13  14
3  18  19  20
4  24  25  26
5  30  31  32
>>> df.iloc[1:,:2]
    0   1
1   6   7
2  12  13
3  18  19
4  24  25
5  30  31
>>> df.iloc[1,2]
8
>>> df.loc[1,2]
8
>>> 

可以看到 df.loc[1:,:2] 选择了 第2 列的内容,但他的本质不是 range(0,2)他包括了结束的2。 他其实是 >= 关系。对column进行判断 取 大于等于2的列。对于不满足条件后立即终止。

>>> df.columns  =  [2,1,3,4,0,5]
>>> df
    2   1   3   4   0   5
0   0   1   2   3   4   5
1   6   7   8   9  10  11
2  12  13  14  15  16  17
3  18  19  20  21  22  23
4  24  25  26  27  28  29
5  30  31  32  33  34  35
>>> df.loc[1,2]
6
>>> df.iloc[1,2]
8
>>> 
>>> df.iloc[1:,:2]
    2   1
1   6   7
2  12  13
3  18  19
4  24  25
5  30  31
>>> df.loc[1:,:2]
    2
1   6
2  12
3  18
4  24
5  30
>>> 

loc 有一个好处就是你可以重新排column的顺序

>>> df.loc[:,(1,2,3,4)]
    1   2   3   4
0   1   0   2   3
1   7   6   8   9
2  13  12  14  15
3  19  18  20  21
4  25  24  26  27
5  31  30  32  33
>>> df.iloc[:,(1,2,3,4)]
    1   3   4   0
0   1   2   3   4
1   7   8   9  10
2  13  14  15  16
3  19  20  21  22
4  25  26  27  28
5  31  32  33  34
>>> 

很神奇把,这个iloc就不好办了,当列名换做了 字母,loc就可以天马行空了。

ix解决混合选取的问题

>>> df.ix[:
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python对redis的常用操作 上 (对.. 下一篇python魔法方法-反射运算和增量运..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目