Dataframe的行标签和列标签其实都是一种索引,每一行也对应位置索引(0到length-1)。Dataframe是dict-like类型,可以通过df[xx]的形式选择单列、多列(传入列表)。Dataframe也是list-list类型,可以通过切片选择数据。基于这些特性,我们可以用直接索引、loc、iloc三个方式来选择数据!

1、直接索引和切片

假设有个二维数据,行索引为A、B、C,列索引为AA、BB、CC,我们按照直接索引或者选取数据,先看一下:

df['A']和df[0] # 都是错误 KeyError

df['BB'] #单列,是Series

df[['BB']] #单列,是DataFrame

df[['BB','CC']] # 两列

df['A':'C'] # 行标签切片,末端包含,返回3行

df[0:2] # 行位置索引切片,末端不包含,返回2行

df[::-1] # 切片,行索引倒过来为CBA

df[[True,False,True]] #选择2行,布尔值是根据行来的

注意事项:df切片是按照行标签或者行的位置索引来的。标签索引切片为末端包含,位置索引切片为末端不包含(切片特性等同于列表)。下面看看代码演示:

df = pd.DataFrame([[1, 2,3], [4, 5,6], [7, 8,9]],

index=['A', 'B', 'C'],

columns=['AA', 'BB','CC'])

print(df['BB'])

print('---------')

print(df[['BB']])

print('---------')

print(df[['BB','CC']])

print('---------')

print(df[0::2])

print('---------')

print(df['A':'C':2])

print('---------')

print(df[::-1])

A 2

B 5

C 8

Name: BB, dtype: int64

---------

BB

A 2

B 5

C 8

---------

BB CC

A 2 3

B 5 6

C 8 9

---------

AA BB CC

A 1 2 3

C 7 8 9

---------

AA BB CC

A 1 2 3

C 7 8 9

---------

AA BB CC

C 7 8 9

B 4 5 6

A 1 2 3

2、loc方式

loc方式比较灵活,可以传入2个"参数"作为条件来分别控制行列选取。

假设有个二维数据,行索引为A、B、C,列索引为AA、BB、CC,loc方式可以有很多花样,先看下

df.loc['A'] # 1行,返回series

df.loc[['A']] # 这是个dataframe,行数是1行

df.loc[['A','B']] # 2行

df.loc['A','AA'] # 标量,单元格的值

df.loc[['A','B'],['AA','CC']] # 2行2列

df.loc['A':'C','AA':'CC'] # 3行3列(切片方式)

df.loc['A':'C',::-1] # 3行3列(切片方式),列顺序翻转

df.loc[[True,True,False],[True,False,True]] # 2行2列(布尔方式)

df.loc['fun1','fun2'] #函数的方式不常用

# -*- coding: utf-8 -*-

import pandas as pd

df = pd.DataFrame([[1, 2,3], [4, 5,6], [7, 8,9]],

index=['A', 'B', 'C'],

columns=['AA', 'BB','CC'])

print(df.loc['A'])

print('-----------')

print(df.loc[['A']])

print('-----------')

print(df.loc[['A','B']])

print('-----------')

print(df.loc['A','AA'])

print('-----------')

print(df.loc[['A','B'],['AA','CC']])

print('-----------')

print(df.loc['A':'C','AA':'CC'])

print('-----------')

print(df.loc['A':'C',::-1])

print('-----------')

print(df.loc[[True,True,False],[True,False,True]])

AA 1

BB 2

CC 3

Name: A, dtype: int64

-----------

AA BB CC

A 1 2 3

-----------

AA BB CC

A 1 2 3

B 4 5 6

-----------

1

-----------

AA CC

A 1 3

B 4 6

-----------

AA BB CC

A 1 2 3

B 4 5 6

C 7 8 9

-----------

CC BB AA

A 3 2 1

B 6 5 4

C 9 8 7

-----------

AA CC

A 1 3

B 4 6

说明:loc可以传入一个函数,函数参数是df。该方法不常用。有兴趣可以看官方文档说明!

mydict = [{'a': 11, 'b': 22},

{'a': 33, 'b': 44},

{'a': 55, 'b': 66}]

df = pd.DataFrame(mydict)

print(df)

print('-----------')

print(df.loc[lambda x: x.index > 1])#行索引大于1

a b

0 11 22

1 33 44

2 55 66

-----------

a b

2 55 66

3.iloc方式

假设有个二维数据,行索引为A、B、C,列索引为AA、BB、CC,我们按照位置索引来选取数据,也有不少花样,看一下:

df.iloc[0] # 1行,是series

df.loc[[0]] # 这是个dataframe,行也是1行

df.iloc[[0,1]] # 2行

df.iloc[0,1] # 标量,单元格的值

df.iloc[[0,1],[0,1]] # 2行2列

df.iloc[0:2,0:2]] # 2行2列(iiloc切片末端不包含)

df.iloc[0:2,::-1] # 2行3列(列索引顺序翻转)

df.iloc[[True,True,False],[True,False,True]] # 2行2列(布尔方式)

df.iloc['fun1','fun2'] #函数的方式不常用

通过行号和列号选取数据,iloc方式可以传入行号和列号来分别控制行列选取,行号和列号从0开始到 length-1。

1)选择单行和多行

# -*- coding: utf-8 -*-

import pandas as pd

df = pd.DataFrame([[1, 2,3], [4, 5,6], [7, 8,9]],

index=['A', 'B', 'C'],

columns=['AA', 'BB','CC'])

print(df.iloc[0])

print('-----------')

print(df.iloc[[0]])

print('-----------')

print(df.iloc[[0,1]])

print('-----------')

print(df.iloc[0,1])

print('-----------')

print(df.iloc[[0,1],[0,1]])

print('-----------')

print(df.iloc[0:2,0:2])

print('-----------')

print(df.iloc[0:2,::-1])

print('-----------')

print(df.iloc[[True,True,False],[True,False,True]])

AA 1

BB 2

CC 3

Name: A, dtype: int64

-----------

AA BB CC

A 1 2 3

-----------

AA BB CC

A 1 2 3

B 4 5 6

-----------

2

-----------

AA BB

A 1 2

B 4 5

-----------

AA BB

A 1 2

B 4 5

-----------

CC BB AA

A 3 2 1

B 6 5 4

-----------

AA CC

A 1 3

B 4 6

说明:iloc可以传入1个函数,该函数的参数为df本身。这种方式使用频率很低。

# -*- coding: utf-8 -*-

import pandas as pd

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},

{'a': 10, 'b': 20, 'c': 30, 'd': 40},

{'a': 100, 'b': 200, 'c': 300, 'd': 400}]

df = pd.DataFrame(mydict)

print(df)

print('-----------')

print(df.iloc[lambda x: x.index % 2 == 0])#行索引除以2余数为0

a b c d

0 1 2 3 4

1 10 20 30 40

2 100 200 300 400

-----------

a b c d

0 1 2 3 4

2 100 200 300 400

4.条件判断

上述案例可知loc和iloc可以"传参"布尔值,不过其类型并不限于列表,可以是Series、df、np数组,只要他们的值为布尔值即可。

实际中常常进行条件判断(大于等于小于或者其他)来筛选数据(对df条件判断的结果就是布尔值组成的Series或者Dataframe)。在多条件判断中,&代表且,|代表或,~代表取反。如果2个条件运算需要加上小括号防止出错。如:df[(df['b']>44) & (df['b'] < 99)]、df[~(df['b']>44)]。

1)单列做判断

# -*- coding: utf-8 -*-

import pandas as pd

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},

{'a': 10, 'b': 20, 'c': 30, 'd': 40},

{'a': 100, 'b': 200, 'c': 300, 'd': 400}]

df = pd.DataFrame(mydict)

print(df)

print('-----------')

res = df['a'] > 5

print(df[res])

a b c d

0 1 2 3 4

1 10 20 30 40

2 100 200 300 400

-----------

a b c d

1 10 20 30 40

2 100 200 300 400

2)多行多列做判断

# -*- coding: utf-8 -*-

import pandas as pd

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},

{'a': 10, 'b': 20, 'c': 30, 'd': 40},

{'a': 100, 'b': 200, 'c': 300, 'd': 400}]

df = pd.DataFrame(mydict)

print(df)

print('-----------')

res = df.iloc[[1,2]] > 20 # 你可以打印res看下结果

print(df[res])

print('------------')

res = df > 30

print(df[res])

a b c d

0 1 2 3 4

1 10 20 30 40

2 100 200 300 400

-----------

a b c d

0 NaN NaN NaN NaN

1 NaN NaN 30.0 40.0

2 100.0 200.0 300.0 400.0

------------

a b c d

0 NaN NaN NaN NaN

1 NaN NaN NaN 40.0

2 100.0 200.0 300.0 400.0

3)多条件判断

# -*- coding: utf-8 -*-

import pandas as pd

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},

{'a': 10, 'b': 20, 'c': 30, 'd': 40},

{'a': 100, 'b': 200, 'c': 300, 'd': 400}]

df = pd.DataFrame(mydict)

print(df)

print('-----------')

res0 = (df['a'] > 0) & (df['c']< 400)

res1 = df['c'] > 100

print(df[res0 & res1])

a b c d

0 1 2 3 4

1 10 20 30 40

2 100 200 300 400

-----------

a b c d

2 100 200 300 400

自定义布尔值的Series或者Datadrame或者列表去对df做筛选,确保自定义的Series元素数和df行数一致。

# -*- coding: utf-8 -*-

import pandas as pd

d = {'col1': [1,2,3], 'col2': [4,'66',6],'col3':[7,8,9]}

df = pd.DataFrame(data=d)

print(df)

print('------------------')

lis=[True,False,True]

s = pd.Series(lis,index=[0,1,2])

print(df[s])

col1 col2 col3

0 1 4 7

1 2 66 8

2 3 6 9

------------------

col1 col2 col3

0 1 4 7

2 3 6 9

# -*- coding: utf-8 -*-

import pandas as pd

d = {'col1': [1,2,3], 'col2': [4,'66',6],'col3':[7,8,9]}

df = pd.DataFrame(data=d,index=[1,2,3])

print(df)

print('------------------')

d2 = {'col1': [True,False,True], 'col2': [True,False,False]}

df2 = pd.DataFrame(d2,index=[0,1,2])

print(df2)

print('==================')

print(df[df2])

col1 col2 col3

1 1 4 7

2 2 66 8

3 3 6 9

------------------

col1 col2

0 True True

1 False False

2 True False

==================

col1 col2 col3

1 NaN NaN NaN

2 2.0 NaN NaN

3 NaN NaN NaN

4)综合练习

# -*- coding: utf-8 -*-

import pandas as pd

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},

{'a': 10, 'b': 20, 'c': 30, 'd': 40},

{'a': 100, 'b': 200, 'c': 300, 'd': 400}]

df = pd.DataFrame(mydict)

print(df)

print('-----------')

print(df[df > 5].loc[1:2]['a'])

a b c d

0 1 2 3 4

1 10 20 30 40

2 100 200 300 400

-----------

1 10.0

2 100.0

Name: a, dtype: float64

python中iloc切片_Dataframe选择行列loc,iloc,切片,布尔索引,条件判断等相关推荐

  1. Python中通过索引名称提取数据loc()函数Python中通过行和列下标提取数据iloc()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中通过索引名称提取数据 loc()函数 Python中通过 ...

  2. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  3. python中如何打开文件选择框

    Python中如何打开文件选择框 1.代码: import win32ui dlg = win32ui.CreateFileDialog(1) # 1表示打开文件对话框 dlg.SetOFNIniti ...

  4. ps切片导出时将切片选项选择为“所有用户切片”

    ps切片导出时将切片选项选择为"所有用户切片",可导出所有切中的区域. 转载于:https://www.cnblogs.com/npk19195global/p/4513707.h ...

  5. python字典可以切片吗_7.map(感觉跟python中的字典有点像)数组,切片(make)傻傻分不清楚,多多指点...

    1.映射关系容器为map,其内部使用散列表(hash)实现 2.map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用 3.map[KeyType]Val ...

  6. Python入门--顺序结构,选择结构,对象的布尔值

    #顺序结构 ############################## '''把大象装冰箱一共分几步''' print('程序开始') print('1.打开冰箱门') print('2.放大象') ...

  7. SpringBoot中使用Thymeleaf常用功能(二):测试Thymeleaf条件判断

    环境搭建请先阅读文章一 在一的基础上 先在index.html中添加超链接 <a th:href="@{iftest}">测试条件判断</a> 在Thyme ...

  8. python中找出numpy array数组的最值及其索引

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...

  9. datagrid中动态显示或隐藏某一列的方法(根据条件判断显示和隐藏)

    在datagrid中,我们常常根据条件想展示或者隐藏某一列,即动态展示某列 onLoadSuccess:function(data){if(!top.checkHiddenSet("plat ...

最新文章

  1. Linux动态库和静态库比较
  2. [Share]Web Directions Conferences
  3. 5G商用将在“十三五”时期内启动
  4. 深度学习-最优化笔记
  5. C#委托、事件学习之(二)——简单按钮委托事件
  6. 旧文重发:程序员的七种武器
  7. Redis学习总结(23)——Redis集群化方案对比:Codis、Twemproxy、Redis Cluster
  8. PHPExcel用法有感
  9. APP下载页面(支持微信扫一扫)
  10. qt5.4 for android,windows下Qt5.4.2 for android开发环境配置
  11. NOIp2013 车站分级 【拓扑排序】By cellur925
  12. 操做系统ucore实验 lab1
  13. java如何防止sql注入
  14. 冰点还原离线激活_冰点还原精灵密钥,小编教你如何激活冰点还原精灵
  15. 2020杭电多校第六场—【1002 Little Rabbit‘s Equation】
  16. android自定义通知栏样式,Android 通知栏自定义样式
  17. css颜色和长度简写
  18. 大话设计模式(五)观察者模式
  19. 苹果双卡双待买哪款合适_2020年买哪款苹果手机好?
  20. SAS小白入门第二节:SAS数据类型和格式化(输入和输出)

热门文章

  1. Java Future详解与使用
  2. 17:57:54.359 [main] WARN com.baomidou.mybatisplus.generator.IDatabaseQuery$D
  3. 好程序员分享MySQL之SQL入门(一)
  4. 中文核心期刊、科技核心期刊、CSCD核心期刊区别
  5. sublime text3安装python插件和flake8_Sublime Text 3中的插件sublimelinter3外加sublimelinter-flake8,无使用效果...
  6. 10-250 B1-2查询供应商及其供应的产品情况
  7. 使用D3D8实现2D图形显示技术
  8. memcpy内存拷贝和=直接赋值有什么区别
  9. (自)协方差矩阵与互协方差矩阵简介
  10. Module Error (from ./node_modules/vue-loader/lib/loaders/templateLoader.js):(Emitted value instead o