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的pdb调试命令的命令整理及实例
Jul 12 Python
python中 logging的使用详解
Oct 25 Python
Python断言assert的用法代码解析
Feb 03 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
Python Django ORM连表正反操作技巧
Jun 13 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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数组应该有多大的分析
2009/07/30 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
简单介绍Python中的RSS处理
2015/04/13 Python
python实现验证码识别功能
2018/06/07 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python读写文件基础知识点
2019/06/10 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
Java里面如何创建一个内部类的实例
2015/01/19 面试题
华三通信H3C面试题
2015/05/15 面试题
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
大型营销活动计划书
2014/04/28 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
个人投资合作协议书
2014/10/12 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2014年司法局工作总结
2014/12/11 职场文书
会议开幕词
2015/01/28 职场文书
行政上诉状范文
2015/05/23 职场文书
请假条应该怎么写?
2019/06/24 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server