pandas DataFrame 数据选取,修改,切片的实现


Posted in Python onApril 24, 2020

在刚开始使用pandas DataFrame的时候,对于数据的选取,修改和切片经常困惑,这里总结了一些常用的操作。

pandas主要提供了三种属性用来选取行/列数据:

属性名 属性
ix 根据整数索引或者行标签选取数据
iloc 根据位置的整数索引选取数据
loc 根据行标签选取数据

先初始化一个DateFrame做例子

import numpy as np
import pandas as pd
df = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])

df是这样的

In [35]: df
Out[35]: 
   name  gender age
0  Snow   M    22
1  Tyrion  M    32
2  Sansa  F    18
3  Arya   F    14

如果每列都有column name,比如这里是: 

In [42]: df.columns
Out[42]: Index(['name', 'gender', 'age'], dtype='object')

1. df['column_name'] ,df[row_start_index, row_end_index] 选取指定整列数据

df['name']
df['gender']
df[['name','gender']] #选取多列,多列名字要放在list里
df[0:] #第0行及之后的行,相当于df的全部数据,注意冒号是必须的
df[:2] #第2行之前的数据(不含第2行)
df[0:1] #第0行
df[1:3] #第1行到第2行(不含第3行)
df[-1:] #最后一行
df[-3:-1] #倒数第3行到倒数第1行(不包含最后1行即倒数第1行,这里有点烦躁,因为从前数时从第0行开始,从后数就是-1行开始,毕竟没有-0)

2. loc,在知道列名字的情况下,df.loc[index,column] 选取指定行,列的数据

loc也提供了五种参数形式

input example(摘自官方文档) output
行标签 df.loc[‘viper'] 选取viper那一行
行标签数组 df.loc[[‘viper', ‘sidewinder']] 选取行标签为viper、sidewinder
行标签切片 df.loc[‘cobra':‘viper', ‘max_speed'] 选取从cobra到viper行的max_speed列
布尔值数组 df.loc[[False, False, True]]
函数 df.loc[df[‘shield'] > 6, [‘max_speed']] 选取shield列大于6的那一行的max_speed数据

注意 df.loc[df[‘one']>10]这样的写法是可以正常选出one列大于10的数据

# df.loc[index, column_name],选取指定行和列的数据
df.loc[0,'name'] # 'Snow'
df.loc[0:2, ['name','age']]  #选取第0行到第2行,name列和age列的数据, 注意这里的行选取是包含下标的。
df.loc[[2,3],['name','age']]  #选取指定的第2行和第3行,name和age列的数据
df.loc[df['gender']=='M','name']  #选取gender列是M,name列的数据
df.loc[df['gender']=='M',['name','age']] #选取gender列是M,name和age列的数据

3. iloc,在column name特别长或者index是时间序列等各种不方便输入的情况下,可以用iloc (i = index), iloc完全用数字来定位 iloc[row_index, column_index]

iloc提供了五种参数形式

input example output
整数(行索引) df.iloc[5] 选取第6行数据
整数数组 df.iloc[[1,3,5]] 选取第2,4,6行数据
整数切片 df.iloc[1:3] 选取2~4行数据(不包含第4行数据)
布尔值数组 df.iloc[[True,False,True] 选取第1,3行数据
函数 df.iloc[(df[‘one']>10).tolist()] 选取'one'这列大于10的那一行数据

注意:iloc接受有返回值的函数作为参数,但要保证函数返回的是整数/整数list,布尔值/布尔list

如果直接运行 df.iloc[df[‘one']>10]

则会报错 NotImplementedError: iLocation based boolean indexing on an integer type is not available

因为df[‘one'] > 10 返回的是 series类型的数据

除此之外,还可以进行组合切片

input example output
整数(行索引) df.iloc[5,1] 选取第6行,第2列的数据
整数数组 df.iloc[[1,3],[1,2]] 选取第2,4行;2,3列的数据
整数切片 df.iloc[1:3,1:3] 选取第2,3行;2,3列的数据
布尔值数组 df.iloc[[True,True,False],[True,False,True]] 选取第1,2行;1,3列的数据

要注意的是,我们用df[参数]也可以进行切片,但这种方式容易引起chained indexing 问题。除此之外,**df[lable1][lable2]**的操作是线性的,对lable2的选取是在df[lable1]的基础上进行,速度相对较慢。所以在对数据进行切片的时候尽量使用iloc这类的方法

df.iloc[0,0] #第0行第0列的数据,'Snow'
df.iloc[1,2] #第1行第2列的数据,32
df.iloc[[1,3],0:2] #第1行和第3行,从第0列到第2列(不包含第2列)的数据
df.iloc[1:3,[1,2] #第1行到第3行(不包含第3行),第1列和第2列的数据

4. ix, ix很强大,loc和iloc的功能都能做到 ix[row_index, column_index]

ix虽然强大,然而已经不再被推荐,因为在最新版的pandas里面,ix已经成为deprecated。(https://github.com/pandas-dev/pandas/issues/14218)

大概是因为可以混合label和position导致了很多用户问题和bug。

所以,用label就用loc,用position就用iloc。

df.ix[0,0] #第0行第0列的数据,'Snow'
df.ix[0,[1,2]] #第0行,第1列和第2列的数据
df.ix[0:2,[1,2]] #第0行到第2行(包含第3行),第1列和第2列的数据
df.ix[1,0:2] #第1行,从第0列到第2列(不包含第2列)的数据

切片时,iloc行不含下标上限,loc,ix行包含,列iloc和ix都不含列下标上限。(设计者的缺憾。。。)

 到此这篇关于pandas DataFrame 数据选取,修改,切片的实现的文章就介绍到这了,更多相关pandas  数据选取,修改,切片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python字符串对象的实现
Dec 24 Python
12步教你理解Python装饰器
Feb 25 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
对python中类的继承与方法重写介绍
Jan 20 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
python set集合使用方法解析
Nov 05 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
Python如何使用input函数获取输入
Aug 06 Python
Python读写Excel表格的方法
Mar 02 Python
在pyCharm中下载第三方库的方法
Apr 18 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 #Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 #Python
python 读取二进制 显示图片案例
Apr 24 #Python
150行python代码实现贪吃蛇游戏
Apr 24 #Python
用 Python 制作地球仪的方法
Apr 24 #Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 #Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 #Python
You might like
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
php实现简单的上传进度条
2015/11/17 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python闭包函数定义与用法分析
2018/07/20 Python
用Python解数独的方法示例
2019/10/24 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
园林资料员岗位职责
2013/12/30 职场文书
货车司机岗位职责
2014/03/18 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
电工技术比武方案
2014/05/11 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
在职员工证明书
2014/09/19 职场文书
2015年团支书工作总结
2015/04/03 职场文书
班级班风口号大全
2015/12/25 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
python操作xlsx格式文件并读取
2021/06/02 Python