【Numpy Pandas】ndarray与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

输出:

onetwothree
a123
b456
c789

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

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

输出:

onethree
a13
c79

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]]

输出:

onethree
a13
c79

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

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值