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 |
觉得有用的话,不要吝惜评论点赞分享哦,希望大家多多包涵,有任何问题欢迎指正、讨论。
本文基于CC-BY-SA 4.0协议,欢迎转载
(博客看累了?去我的B站瞧一瞧?)