选择、修改数据(单层索引)

  • 推荐使用.at、.iat、.loc、.iloc
操作 句法 结果 备注
选择列 df[col] Series 基于列名(列的标签),返回Series
用标签选择行 df.loc[label] Series 基于行名、列名(行、列的标签),默认为df.loc(axis=0)[label]
用函数选择行 df.loc[lambda,lambda] Series 基于行名、列名(行、列的数值),默认为df.loc(axix=0)[lambda]
用整数位置选择行 df.iloc[loc] Series 基于行、列的位置(行、列的数值索引)
选择列 df[[col]] DataFrame 基于列名(列的标签),返回DataFrame
行切片 df[5:10] DataFrame 基于行、列的位置(行、列的数值索引)
用布尔向量选择行 df[bool_vec] DataFrame
混合方式 df.xs(col, axis=1) DataFrame 基于行、列的标签(需指定axis=0或1)
用列名选择列 df.col DataFrame 基于列名(列的标签),同df[col]
# 获取数据
df['A']
# 对行切片,按自增索引,左闭右开
df[0:3]
# 对行切片,按自建索引,左闭右闭
df['20130102':'20130104']
# 按标签提取行,如果多行,可以嵌套list
df.loc[dates[0]]
# 按标签提取列,如果多列,可以嵌套list
df.loc[:, ['A','B']]
# 按标签切片,如果多行、多列,可以嵌套list
# 如果通过:选取多行,不加中括号
# 如果通过指定列名选择多列,加中括号
df.loc['20130102':'20130104', ['A','B']]
# 甚至可以通过选中多列进行就地变换
df.loc[['A', 'B']] = df.loc[['A','B']]
# 按位置切片,如果多行,可以嵌套list
df.iloc[0]
# 按位置切片,如果多列,可以嵌套list
df.iloc[:, [0,2]]
# 按位置切片的同时,使用字典指定列进行值的修改
df.iloc[0,[0,2]] = {'x':9,'y':99}
# 选择标量可以使用at、iat,效果同上
df.at['20130101','A'] 等同于 df.loc['20130101', 'A']
df.iat[0,0] 等同于 df.iloc[0,0]
# 重建指定列的索引,返回数据副本,不更改原数据
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
# 字符索引同样可以选择范围,按照定义中index、columns的顺序
df.loc['A':'C']
# 完全超出边界的切片(不是单个索引)会返回空DataFrame
df.iloc[:, 1000:1001] # df仅2列
# 部分超出边界的切片会返回仅有的数据
df.iloc[:, 0:5] # df仅2列,仅返回2列
# 超出边界的单个索引会报错IndexError
df.iloc[:, [2]] #df仅2列,索引2超出边界
# loc、iloc、[]接受lambda函数
df.[lambda df: df.columns[0]]
# 对每行记录进行过滤,如果该行的col列包含字符串model,即可保留该行,否则会被过滤掉
df.loc(axis=1)[lambda x: x['col'].str.contains('keyword')]
# 根据另一个df的col列对当前df的值进行过滤,要对另一个df的col列进行to_list处理,假设test为that['col']中的值,"test" in that['col']为false,除非"test" in that['col'].to_list()
df.loc[lambda x: x['col'].isin(that['col'].to_list())]

重置索引

  • 当对df进行筛选后行索引会不连续,如需将索引转为连续索引,使用reset_index
df.reset_index() # 生成新的连续索引,原行索引变为index列,插入到原DataFrame
df.reset_index(drop=True) # 丢弃原行索引,使用新的连续索引替换

重建索引

# reindex,沿着指定轴,让数据与给定的一组索引名或列名进行匹配
# 1.匹配给定的索引名或列名,并按给定顺序排列
# 2.匹配不上的索引或列名,填充nan值
# 3.匹配不上的索引或列名,可以填充指定的值
s = pd.DataFrame(np.random.randn(5,3), index=['a', 'b', 'c', 'd', 'e'],columns=['one','two','three'])
s.reindex(index=['e', 'b', 'f', 'd']) # 原数据中无'f'索引名,输出中f行对应nan
s.reindex(['e', 'b', 'f', 'd'], axis='index') #同上
s.reindex(df.index) #引用其他DataFrame的索引
s.reindex(columns=['three','two','one']) # 原数据列按照'three','two','one'的顺序重新排列
s.reindex(['three','two','one'], axis='columns') # 同上
# reindex_like()与另一个具有相同标签的DataFrame进行对齐,未对齐的元素使用NaN填充
df1.reindex_like(df2)
方法 动作
pad / ffill 先前填充
bfill / backfill 向后填充
nearest 从最近的索引值填充
# 重建索引,并填充nan值
df1.reindex(df2.index, method='ffill')
# 等价于
df1.reindex(df2.index).fillna(method='ffill')
df1.reindex(df2.index, method='bfill')
# 等价于
df1.reindex(df2.index).fillna(method='bfill')
df1.reindex(df2.index, method='nearest')
# 等价于
df1.reindex(df2.index).fillna(method='nearest')
# limit与tolerance用于限制填充操作
df1.reindex(df2.index, method='ffill', limit=1) # nan值只向前寻找一次,如果前面初始值为nan则保持nan值
df1.reindex(df2.index, method='ffill', tolerance='1 day') # 针对时间索引,容忍向前寻找1天
# rename用于重命名行或列,提供inplace参数,inplace为True时在原数据上更改,False时生成数据副本
df.rename(index={'a':'apple', 'b':'banana'}, columns={'one': '1', 'two':'2'})
df.rename({'a':'apple', 'b':'banana'}, axis='index')
df.rename({'one': '1', 'two':'2'}, axis='columns')

布尔索引

符号 作用
| or
& and
~ not
# 对值进行布尔运算
df[(df['A'] > 0 ) | (df['A'] < 1)] # 或
df[(df['A'] > 0) & (df['A'] < 1)] # 并
df[~df['A'] > 0] # 非 # 对索引值进行布尔索引pd.index.isin(),对索引进行筛选,返回多行或多列
s_mi = pd.Series(np.arange(6), index=pd.MultiIndex.from_product([0,1],['a','b','c']))
s_mi.iloc[s_mi.index.isin([(1,'a'),(2,'b')])]
s_mi.iloc[s_mi.index.isin(['a','b',,'c'], level=1)]
# 对DataFrame进行布尔索引pd.isin(),对值进行筛选,返回DataFrame
df.isin()
# 结合any()、all(),对DataFrame进行布尔索引
df =pd.DataFrame({'vals':[1,2,3,4],'ids':['a','b','f','n'],'ids2':['a','n','c','n']})
values ={'ids':['a','b'],'vals':[1,3]}
row_mask =df.isin(values).any(1)
row_mask =df.isin(values).all(1)
# 替换,where()布尔运算,若判断条件为False,则替换为指定的值
df.where(df>0, df['A'],axis='index',level=1)
# 替换,mask()反布尔运算,where的逆运算
df.mask(df>0,df['A'],axis='index',level=1)

使用query实现布尔运算

# query()使用列名代替df[列名]、
df.query('a < b & b < c')
# query()使用index代替索引名进行布尔索引
df.query('color == "red"')
# query()多重索引未命名时,这里以第一层索引为例
df.query('ilevel_0 =="red"')
# query()当列名包含特殊字符如空格时,需要用反引号
df.query('`color type` == "red" ')
# query()包含简单的计算时
df.query(' a + b < c ')
# query()可以包含小括号,调整判断顺序
df.query(' ( a > 0 & a < 5 ) | ( a < 0 & a > -5 )')

比较操作

  • 支持的比较操作
缩写 作用
eq 等于
ne 不等于
lt 小于
gt 大于
le 小于等于
ge 大于等于
# 举例
# Series与DataFrame之间支持eq、ne、lt、gt、le、ge等比较操作
df.gt(df2)

布尔简化

# 把数据汇总按列简化至单个布尔值
(df > 0).all()
pd.Series([True]).bool()

支持的布尔简化操作

缩写 作用 例子
empty() 判空 s.empty()
any() 或运算 s.any()
all() 且运算 s.all()
bool() 验证单个元素的布尔值

nan值比较

# nan值比较,df中的nan必须用equals()、isna()、notna()
np.nan == np.nan #直接比较为False
np.nan.equals(np.nan) #equal比较为True
np.isna(np.nan) #np.isna对行、列判断是否为nan

equals()比较

# equals()要求索引顺序必需一致,比较结果才能为True
df1 = pd.DataFrame({'col':['foo', 0, np.nan]})
df2 = pd.DataFrame({'col':[np.nan,0,'foo']}, index=[2,1,0])
df1.equals(df2) #False
df1.equals(df2.reset_index()) #True

【python】pandas 索引操作的更多相关文章

  1. pandas索引操作

    Pandas的索引操作 索引对象Index 1. Series和DataFrame中的索引都是Index对象 示例代码: print(type(ser_obj.index)) print(type(d ...

  2. Python pandas DataFrame操作

    1. 从字典创建Dataframe >>> import pandas as pd >>> dict1 = {'col1':[1,2,5,7],'col2':['a ...

  3. python pandas dataframe 操作记录

    从数据看select出数据后如何转换为dataframe df = DataFrame(cur.fetchall()) 如何更改列名,选取列,进行groupby操作 df.columns = ['me ...

  4. Python Pandas操作Excel

    Python Pandas操作Excel 前情提要 ☟ 本章使用的 Python3.6 Pandas==0.25.3 项目中需要用到excel的文件字段太多 考虑到后续字段命名的变动以及中文/英文/日 ...

  5. 【Python自动化Excel】Python与pandas字符串操作

    Python之所以能够成为流行的数据分析语言,有一部分原因在于其简洁易用的字符串处理能力. Python的字符串对象封装了很多开箱即用的内置方法,处理单个字符串时十分方便:对于Excel.csv等表格 ...

  6. 用Python的pandas框架操作Excel文件中的数据教程

    用Python的pandas框架操作Excel文件中的数据教程 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其 ...

  7. Python pandas学习总结

    本来打算学习pandas模块,并写一个博客记录一下自己的学习,但是不知道怎么了,最近好像有点急功近利,就想把别人的东西复制过来,当心沉下来,自己自觉地将原本写满的pandas学习笔记删除了,这次打算写 ...

  8. Python -- Pandas介绍及简单实用【转】

    转http://www.datadependence.com/2016/05/scientific-python-pandas/ 一. Pandas简介 1.Python Data Analysis ...

  9. Python pandas快速入门

    Python pandas快速入门2017年03月14日 17:17:52 青盏 阅读数:14292 标签: python numpy 数据分析 更多 个人分类: machine learning 来 ...

随机推荐

  1. C#/VB.NET 在Word转PDF时生成目录书签

    当我们在转换Word文档到PDF格式时,想保留Word文档的标题作为PDF书签,那么应该如何操作呢?那么本文将以C#及VB.NET代码为例,介绍如何在Word转PDF时生成目录书签.下面是具体方法和步 ...

  2. SQL语句修改MySQL用户密码

    SQL语句修改MySQL用户密码 前言 上数据库安全实验课,用命令行和DataGrip试图修改用户密码,一直语法报错.最后用Navicat才修改成功,预览Navicat的SQL语句,发现语句和网上都不 ...

  3. 这就是艺术「GitHub 热点速览 v.22.25」

    作者:HelloGitHub-小鱼干 不知道写了那么久代码的你,是否还记得"代码写诗"这个词,它是用来形容代码的优雅.但是本周的项目,虽然你看到的是代码的成品,也会惊讶于它的艺术感 ...

  4. 入行数字IC验证后会做些什么?

    半年前,公众号写了第一篇推文<入行数字IC验证的一些建议>,介绍了IC小白可以如何一步一步地摸索入门数字IC验证,同时也在知乎发了这篇入门贴,并且衍生出很多额外基础的内容,收获了不少的浏览 ...

  5. python小题目练习(三)

    题目:输出1!+2!+3!+--+10!的结果代码实现: # 定义一个函数来递归实现阶乘操作def cycle(num): if num == 1: return 1 else: return num ...

  6. java中JVM和JMM之间的区别

    一 jvm结构 jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用. 1 Class Loader(类加载器)就是将Class文件加载到内存,再说的 ...

  7. 用python进行加密和解密——我看刑

    加密和解密 密码术意味着更改消息的文本,以便不知道你秘密的人永远不会理解你的消息. 下面就来创建一个GUI应用程序,使用Python进行加密和解密. 在这里,我们需要编写使用无限循环的代码,代码将不断 ...

  8. Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱

    写在前面的一些P话: 今天这个案例,就是控制自己的摄像头拍照,并且把拍下来的照片,通过邮件发到自己的邮箱里.想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路 通过opencv调用摄像头拍 ...

  9. 『现学现忘』Git后悔药 — 27、版本回退介绍

    目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...

  10. Collection集合概述和集合框架介绍avi

    集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢?· ~集合︰集合是java中提供的一种容器,可以用来存储多个数据集合和数组既然都是容器,它 ...