array类型 与 DataFrame类型 切片时的异同(二次切片)

Python中的numpy库的array数据类型和pandas库的DataFrame数据类型有相似之处,DataFrame可以看做有行索引和列索引的二维数组。它们也都有‘切片’的概念,即选择指定的行 和/或 列中的数据。下面讨论array类型 与 DataFrame类型 切片时的异同,其中array类型常常会涉及‘二次切片’这种操作。


(以下是在JupyterNotebook中的运行结果)

import pandas as pd
import numpy as np
from pandas import Series, DataFrame

创建array对象:

arr = np.arange(1,10).reshape(3,3)
arr

输出:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

基于arr对象创建DataFrame对象:

data = DataFrame(arr, index=['a', 'b', 'c'], columns=['one', 'two', 'three'])
data

输出:

one two three
a 1 2 3
b 4 5 6
c 7 8 9

如果我们要选取 第0、2行 和 第0、2列 的数据(即1,3,7,9四个数):
对于DataFrame类型的对象,可以直接使用 obj.iloc[ ilocList, clocList ] 进行选取(切片):

data.iloc[ [0,2], [0,2] ]

输出:

one three
a 1 3
c 7 9

array对象的切片参数虽然也可以是列表,但这样的运行结果是两个数,即选取了位置为(0,0),(2,2)的两个数:

arr[ [0,2], [0,2] ]

输出:

array([1, 9])

所以对于array对象需使用二次切片才能完成:

arr[ [0,2], : ][ :, [0,2] ]

输出:

array([[1, 3],
       [7, 9]])

其中的原理在于先生成了:

temp = arr[ [0,2], : ]
temp

输出:

array([[1, 2, 3],
       [7, 8, 9]])

再对temp选取其中的第0、2列:

temp[ :, [0,2] ]

输出:

array([[1, 3],
       [7, 9]])

综上:

对于DataFrame对象要选取处于 第1, 2, n行第1, 2, n列 的交叉点的数据,使用
data.iloc[ [0,1,n], [0,1,n] ]

对于array对象要选取 第1, 2, n行第1, 2, n列 的交叉点的数据,需要为此切片,即
arr[ [0,1,n], [0,1,n] ]

p.s.如果对于array类型写成arr[ [0,1,n], [0,1,n] ],表示的是选取(0,0)(1,1)(n,n)这三个散点


p.p.s.根据这个思路,其实data.iloc[ [0,2], [0,2] ]也等价于二次切片:

data.iloc[[0,2],:].iloc[:,[0,2]]

输出:

one three
a 1 3
c 7 9

觉得有用的话,不要吝惜评论点赞分享哦,希望大家多多包涵,有任何问题欢迎指正、讨论。

发布了12 篇原创文章 · 获赞 5 · 访问量 2444

猜你喜欢

转载自blog.csdn.net/qq_27133869/article/details/103759455