• [Pandas] 按轴标签.loc VS 按数字索引.iloc


    美图欣赏2022/06/24

    iloc和loc的区别

    1.loc是基于索引值的,切片是左闭右闭的

    2.iloc是基于位置的,切片是左闭右开的

    1.按轴标签.loc

    .loc的格式是df.loc[<行表达式>,<列表达式>],如果<列表达式>不传,将返回所有列

    Series仅支持<行表达式>进行索引的部分

    .loc操作通过索引和列的条件筛选出数据,如果仅返回一条数据,则该数据类型为Series

    以下示例为单个索引

    1. import pandas as pd
    2. df = pd.DataFrame([['liver','E',89,21,24,64],
    3. ['Arry','C',36,37,37,57],
    4. ['Ack','A',57,60,18,84],
    5. ['Eorge','C',93,96,71,78],
    6. ['Oah','D',65,49,61,86]
    7. ],
    8. columns = ['name','team','Q1','Q2','Q3','Q4'])
    9. # 选择索引为0的行
    10. res1 = df.loc[0]
    11. # 选择索引为4的行
    12. res2 = df.loc[4]
    13. # 如果索引是字符,需要加引号
    14. # 索引为name
    15. # 选择索引name为Ack的行
    16. res3 = df.set_index('name').loc['Ack']

    df 

    res1

    res2

    res3 

    以下示例为列表组成的索引

    1. import pandas as pd
    2. df = pd.DataFrame([['liver','E',89,21,24,64],
    3. ['Arry','C',36,37,37,57],
    4. ['Ack','A',57,60,18,84],
    5. ['Eorge','C',93,96,71,78],
    6. ['Oah','D',65,49,61,86]
    7. ],
    8. columns = ['name','team','Q1','Q2','Q3','Q4'])
    9. # 指定索引为0,2,4的行
    10. res1 = df.loc[[0,2,4]]
    11. # 索引设置为name,两位学生
    12. res2 = df.set_index('name').loc[['Arry','Ack']]

    df

    res1

    res2 

    以下示例为带标签的切片(包括起始和停止)

    1. import pandas as pd
    2. df = pd.DataFrame([['liver','E',89,21,24,64],
    3. ['Arry','C',36,37,37,57],
    4. ['Ack','A',57,60,18,84],
    5. ['Eorge','C',93,96,71,78],
    6. ['Oah','D',65,49,61,86]
    7. ],
    8. columns = ['name','team','Q1','Q2','Q3','Q4'])
    9. # 索引切片,代表0~3行,包括3
    10. res1 = df.loc[0:3]
    11. res2 = df.loc[:]

    df

    res1

    res2

    附带列筛选,必须有行筛选

    1. # 前3行,name和Q2两列
    2. res3 = df.loc[0:2,['name','Q2']]
    3. # 所有列,Q1和Q2两列
    4. res4 = df.loc[:,['Q1','Q2']]
    5. # 0~2行,Q1后边所有列
    6. res5 = df.loc[:2,'Q1':]
    7. # 所有内容
    8. res6 = df.loc[:,:]

    res3

    res4

    res5

    res6 

    提示

    .loc中的表达式支持条件表达式,可以按条件查询数据 

    1. import pandas as pd
    2. df = pd.DataFrame([['liver','E',89,21,24,64],
    3. ['Arry','C',36,37,37,57],
    4. ['Ack','A',57,60,18,84],
    5. ['Eorge','C',93,96,71,78],
    6. ['Oah','D',65,49,61,86]
    7. ],
    8. columns = ['name','team','Q1','Q2','Q3','Q4'])
    9. # 判断数值部分的所有值是否大于60
    10. res1 = df.loc[:,'Q1':'Q4'] > 60
    11. # Q1大于90,显示Q1及其后所有列
    12. res2 = df.loc[df['Q1'] > 90,'Q1':]
    13. # and关系
    14. res3 = df.loc[(df.Q1 > 50) & (df.Q2 < 65)]
    15. # or关系
    16. res4 = df.loc[(df.Q1 > 90) | (df.Q3 < 30)]
    17. # Q1等于36
    18. # res5 = df.loc[df.Q1 == 36]
    19. res5 = df.loc[df['Q1'] == 36]
    20. # Q1大于90,只显示Q1
    21. res6 = df.loc[df['Q1'] > 90,'Q1']

    df

    res1 

    res2 

    res3 

    res4

    res5 

    res6 

    需要注意在进行或(|)、与(&)、非(~)运算时,各个独立逻辑表达式需要用括号括起来 

    1. # Q1、Q2成绩都超过50分的行记录
    2. res7 = df[(df.loc[:,['Q1','Q2']] > 50).all(1)]
    3. # Q1、Q2成绩至少有一个超过50分的行记录
    4. res8 = df[(df.loc[:,['Q1','Q2']] > 50).any(1)]

    res7

    res8 

    上述两例对两个列整体先做逻辑计算得到一个两列的布尔序列,然后用all和any在行方向上做逻辑运算

    all和any可以传入axis参数值用于指定判断方向,默认0为列方向,1为行方向

    2.按数字索引.iloc

    .iloc的格式是df.iloc[<行表达式>,<列表达式>]

    与loc[]可以使用索引和列的名称不同,iloc[]使用数字索引(行和列的0~n索引)进行数据筛选,意味着iloc[]两个表达式只支持数字切片形式,其他方面和loc[]是相同的

    1. import pandas as pd
    2. df = pd.DataFrame([['liver','E',89,21,24,64],
    3. ['Arry','C',36,37,37,57],
    4. ['Ack','A',57,60,18,84],
    5. ['Eorge','C',93,96,71,78],
    6. ['Oah','D',65,49,61,86]
    7. ],
    8. columns = ['name','team','Q1','Q2','Q3','Q4'])
    9. # 前三行(左闭右开)
    10. res1 = df.iloc[:3]
    11. # 所有数据
    12. res2 = df.iloc[:]
    13. # 步长为2
    14. res3 = df.iloc[0::2]
    15. # 返回0~2行,前两列
    16. res4 = df.iloc[:3,[0,1]]
    17. # 返回0~2行,所有列
    18. res5 = df.iloc[:3,:]
    19. # 返回0~2行,从右往左第三列以左的所有列
    20. res6 = df.iloc[:3,:-2]
    21. # 获取name字段前3个值
    22. res7 = df['name'].iloc[:3]

    df

    res1 

    res2 

    res3

    res4

    res5

    res6

    res7

    提示

    .iloc中的表达式支持条件表达式,可以按条件查询数据,用法和.loc是相似的,可参考上述.loc按条件查询数据案例

  • 相关阅读:
    Linux(Centos7)服务器中配置Mysql主从数据库,以及数据库的安装,防火墙操作
    【java8】时间日期的使用与格式化
    C++ 的设计模式之 工厂方法加单例
    〖全域运营实战白宝书 - 运营角色认知篇⑧〗- 运营人的发展路径
    uniapp转抖音小程序踩坑记录
    南昌服务器托管让数据存储更安全
    死亡游戏:密室互猜硬币规则及其破解方法
    第三章:最新版零基础学习 PYTHON 教程(第七节 - Python 运算符—Python 成员身份和身份运算符)
    openssl中SM2、SM3、SM4使用实例
    Java爬虫框架下代理使用中的TCP连接池问题及解决方案
  • 原文地址:https://blog.csdn.net/Hudas/article/details/123096447