numpy和pandas数组切片
numpy 切片
二维数组例子
大多数情况下都是二维的,比较常用。
按行切片
In [2]: import numpy as np
In [3]: array = np.array( [[1, 2], [3, 4]])
In [4]: array
Out[4]: 
array([[1, 2],
       [3, 4]])
In [5]: array[0]  # 取第一行
Out[5]: array([1, 2])
In [6]: array[0:2] # 取第一行到第二行, ":" 表示 从哪到哪,也就是区间的开始和结束,前开后闭
Out[6]: 
array([[1, 2],
       [3, 4]])
In [7]: array[:]  # 取全部的行,区间开始默认是0, 结束默认是 shape[0] + 1
Out[7]: 
array([[1, 2],
       [3, 4]])
In [8]: array[[0, 1]]  # 按索引取指定的行
Out[8]: 
array([[1, 2],
       [3, 4]])
按列切片
In [11]: array = np.array( [[1, 2], [3, 4]])
In [12]: array[:, 0]  # 取第1列, 用逗号隔开表示操作下一维(y轴)的数据
Out[12]: array([1, 3]) 
In [14]: array[0:2, 0]  # 与按行切换连用,取前两行&第一列的数据
Out[14]: array([1, 3])
In [15]: array[0:2, [0,1] ]  # 取前两行 & 第0列和第1列的数据
Out[15]: 
array([[1, 2],
       [3, 4]])
In [16]: array[[1], [0,1] ]  # 指定行列取值, 取第一行 & 第0列和第1列的数据
Out[16]: array([3, 4])
三维/高维 数组例子
方法是一样的,用","隔开表示操作下一维度的数据。
In [17]: import numpy as np
    ...: array=np.array( [[[1,2],[4,5],[7,8]], [[10,20],[40,50],[70,80]]] )
In [18]: array.shape
Out[18]: (2, 3, 2)  # 两行数据,每一行是一个3x2的数组
In [19]: array
Out[19]: 
array([[[ 1,  2],
        [ 4,  5],
        [ 7,  8]],
       [[10, 20],
        [40, 50],
        [70, 80]]])
In [21]: array[:,[1],:]  # 每一行都是3x2,取这三行的中间那行, 3x2的shape变成了1x2,结果的shape就变成了(2, 1, 2)
Out[21]: 
array([[[ 4,  5]],
       [[40, 50]]])
In [24]: array[:,[1],:].shape
Out[24]: (2, 1, 2)
In [22]: array[:,:,[0]]  #  每一行都是3x2,取第二列,3x2的shape变成了3x1,结果的shape变成2x3x1
Out[22]: 
array([[[ 1],
        [ 4],
        [ 7]],
       [[10],
        [40],
        [70]]])
In [23]: array[:,:,[0]].shape
Out[23]: (2, 3, 1)
pandas 切片
pandas如果直接对DataFrame进行切片,只能操作行,如果还要操作列需要使用pd.DataFrame.iloc:
In [24]: df = pd.DataFrame(data=[[1,2], [3,4]])
In [25]:
In [25]: df[:1]
Out[25]:
   0  1
0  1  2
In [27]: df[:1]  # 取第一行
Out[27]:
   0  1
0  1  2
In [28]: df[:1, 1]  # 如果要取列则报错,需要使用iloc
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-28-e53f18cf1f5d> in <module>
----> 1 df[:1, 1]
~/miniconda3/envs/cooka/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
   3022             if self.columns.nlevels > 1:
   3023                 return self._getitem_multilevel(key)
-> 3024             indexer = self.columns.get_loc(key)
   3025             if is_integer(indexer):
   3026                 indexer = [indexer]
~/miniconda3/envs/cooka/lib/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance)
    352                 except ValueError as err:
    353                     raise KeyError(key) from err
--> 354             raise KeyError(key)
    355         return super().get_loc(key, method=method, tolerance=tolerance)
    356
KeyError: (slice(None, 1, None), 1)
In [29]: df.iloc[:1, 1]  # 使用iloc可以操作行或者列
Out[29]:
0    2
Name: 1, dtype: int64
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号