Python Pandas如何获取和修改任意位置的值(at,iat,loc,iloc)
作者:饺子大人 发布时间:2024-01-01 23:16:43
前言
要在pandas.DataFrame中的任何位置检索或更改数据,可以使用at,iat,loc,iloc。
位置的指定方法
at,loc:行标签(行名),列标签(列名)
iat,iloc:行号,列号
选择和获取/更改的数据
选择的行/列的获取和修改
列表和切片的范围指定
at,iat:单个元素的值
loc,iloc:单个元素和多个元素值
其他
at和iat的处理速度比loc和iloc更快
如果要通过组合标签和数字来指定位置,请在index或column处或loc处组合(末尾说明)
在此将描述以下内容。
at,iat:选择,获取和更改单个元素的值
loc,iloc:选择,获取和更改单个和多个元素的值
选择单个元素的值
选择多个元素值
选择行/列
当行名和列名具有重复值时
通过数字和标签指定位置
在pandas.Series中选择行时的隐式类型转换
还可以使用直接索引df []选择/获取pandas.DataFrame的行/列和pandas.Series的元素值。
在此示例代码中,将以下csv数据与read_csv结合使用。
age state point
name
Alice 24 NY 64
Bob 42 CA 92
Charlie 18 CA 70
Dave 68 TX 70
Ellen 24 CA 88
Frank 30 NY 57
第一列设置为参数index_col中的index。
import pandas as pd
df = pd.read_csv('./data/04/sample_pandas_normal.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
行标签(索引)和列标签(列)的值如下。
print(df.index.values)
# ['Alice' 'Bob' 'Charlie' 'Dave' 'Ellen' 'Frank']
print(df.columns.values)
# ['age' 'state' 'point']
at,iat:选择,获取和更改单个元素的值
at通过行标签和列标签指定位置。除了获取数据之外,还可以在该位置设置(替换)新值。
print(df.at['Bob', 'age'])
print(df.at['Dave', 'state'])
# 42
# TX
df.at['Bob', 'age'] = 60
print(df.at['Bob', 'age'])
# 60
iat通过行号和列号指定位置。行号和列号以0开头。
iat和at一样,iat不仅可以获取数据,而且可以在该位置设置(替代)新值。
print(df.iat[1, 0])
print(df.iat[3, 1])
# 60
# TX
df.iat[1, 0] = 42
print(df.iat[1, 0])
# 42
loc,iloc:选择,获取和更改单个和多个元素的值
loc和iloc通过指定范围不仅可以选择单个值,还可以选择多个数据。
loc通过行和列标签指定位置,而iloc通过行和列编号指定位置。
选择单个元素的值
访问单个值时,它与at和iat相同。 但at和iat的处理速度更快。
print(df.loc['Bob', 'age'])
print(df.iloc[3, 1])
# 42
# TX
除了查看数据外,还可以在该位置设置(替换)新值。
df.loc['Bob', 'age'] = 60
print(df.loc['Bob', 'age'])
# 60
df.iloc[1, 0] = 42
print(df.iloc[1, 0])
# 42
选择多个元素值
要访问多个值,在列表[x,y]或切片[start:stop:step]中指定数据的范围和位置。引用的值将是pandas.Series或pandas.DataFrame。
切片的写入方式与普通切片相同。step可以省略。
print(df.loc['Bob':'Dave', 'age'])
print(type(df.loc['Bob':'Dave', 'age']))
# name
# Bob 42
# Charlie 18
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(df.loc[:'Dave', ['age', 'point']])
print(type(df.loc[:'Dave', 'age':'point']))
# age point
# name
# Alice 24 64
# Bob 42 92
# Charlie 18 70
# Dave 68 70
# <class 'pandas.core.frame.DataFrame'>
print(df.iloc[:3, [0, 2]])
print(type(df.iloc[:3, [0, 2]]))
# age point
# name
# Alice 24 64
# Bob 42 92
# Charlie 18 70
# <class 'pandas.core.frame.DataFrame'>
如果指定了step,则可以提取并获取奇数或偶数行。
print(df.iloc[::2, 0])
print(type(df.iloc[::2, 0]))
# name
# Alice 24
# Charlie 18
# Ellen 24
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(df.iloc[1::2, 0])
print(type(df.iloc[1::2, 0]))
# name
# Bob 42
# Dave 68
# Frank 30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
可以一次更改多个值。
print(df.loc['Bob':'Dave', 'age'])
# name
# Bob 20
# Charlie 30
# Dave 40
# Name: age, dtype: int64
选择行/列
若要选择行或列,可以使用直接索引引用df [],但只能在以下指定方法中使用。
行选择:行名和行号的切片
列选择:列名称或列名称列表
print(df['Bob':'Ellen'])
# age state point
# name
# Bob 20 CA 92
# Charlie 30 CA 70
# Dave 40 TX 70
# Ellen 24 CA 88
print(df[:3])
# age state point
# name
# Alice 24 NY 64
# Bob 20 CA 92
# Charlie 30 CA 70
print(df['age'])
# name
# Alice 24
# Bob 20
# Charlie 30
# Dave 40
# Ellen 24
# Frank 30
# Name: age, dtype: int64
print(df[['age', 'point']])
# age point
# name
# Alice 24 64
# Bob 20 92
# Charlie 30 70
# Dave 40 70
# Ellen 24 88
# Frank 30 57
当使用loc和iloc选择行或列时,可以比索引参考df []更灵活地指定它。
在loc和iloc中省略该列,则它将是行引用。可以选择无法通过索引引用完成的单行,也可以选择列表中的多行。
print(df.loc['Bob'])
print(type(df.loc['Bob']))
# age 20
# state CA
# point 92
# Name: Bob, dtype: object
# <class 'pandas.core.series.Series'>
print(df.iloc[[1, 4]])
print(type(df.iloc[[1, 4]]))
# age state point
# name
# Bob 20 CA 92
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
可以通过将行规范设置为loc和iloc中的(整个切片)来引用列。可以使用索引引用无法完成的切片。也可以在iloc中使用列号。
print(df.loc[:, 'age':'point'])
print(type(df.loc[:, 'age':'point']))
# age state point
# name
# Alice 24 NY 64
# Bob 20 CA 92
# Charlie 30 CA 70
# Dave 40 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
# <class 'pandas.core.frame.DataFrame'>
print(df.iloc[:, [0, 2]])
print(type(df.iloc[:, [0, 2]]))
# age point
# name
# Alice 24 64
# Bob 20 92
# Charlie 30 70
# Dave 40 70
# Ellen 24 88
# Frank 30 57
# <class 'pandas.core.frame.DataFrame'>
当行名和列名具有重复值时
具有重复值的行和列也可以在index和columns中指定。
例,其中将具有重复值的列指定为index。
df_state = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=2)
print(df_state)
# name age point
# state
# NY Alice 24 64
# CA Bob 42 92
# CA Charlie 18 70
# TX Dave 68 70
# CA Ellen 24 88
# NY Frank 30 57
print(df_state.index.values)
# ['NY' 'CA' 'CA' 'TX' 'CA' 'NY']
如果在中指定重复的列名,则numpy.ndarray中将返回多个值。
print(df_state.at['NY', 'age'])
print(type(df_state.at['NY', 'age']))
# [24 30]
# <class 'numpy.ndarray'>
如果在loc中指定重复的列名,则它将在pandas.DataFrame或pandas.Series中返回。
print(df_state.loc['NY', 'age'])
print(type(df_state.loc['NY', 'age']))
# state
# NY 24
# NY 30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(df_state.loc['NY', ['age', 'point']])
print(type(df_state.loc['NY', ['age', 'point']]))
# age point
# state
# NY 24 64
# NY 30 57
# <class 'pandas.core.frame.DataFrame'>
在iat或iloc中指定列号时,即使值重复也没有关系。
print(df_state.iat[0, 1])
# 24
可以使用index.is_unique和column.is_unique检查列标签和行标签是否具有唯一值(不重复)。
print(df_state.index.is_unique)
# False
print(df_state.columns.is_unique)
# True
通过数字和标签指定位置
如果要使用数字和标签(例如行号和列标签)的组合指定位置,则可以在at或loc处使用索引或列。可以按索引或列从行号或列号中获取行标签和列标签。
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 20 CA 92
# Charlie 30 CA 70
# Dave 40 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
print(df.index[2])
# Charlie
print(df.columns[1])
# state
使用at或loc,可以通过数字和标签的组合来指定位置。
print(df.at[df.index[2], 'age'])
# 30
print(df.loc[['Alice', 'Dave'], df.columns[1]])
# name
# Alice NY
# Dave TX
# Name: state, dtype: object
在使用slice start:stop:step进行指定时,如果loc使用行标签/列标签,则直到停止为止,但如果iloc使用行号/列编号,则将直到停止前成为请注意,如果要将stop的值从数字转换为标签,则需要执行类似索引[n-1]的操作。
另外,如下所述,当选择一行时,可以执行隐式类型转换。 最好使用上面显示的索引和列将它们组合为at或loc。
print(df['age'][2])
# 30
print(df.age[2])
# 30
print(df.loc[['Alice', 'Dave']].iloc[:, 1])
# name
# Alice NY
# Dave TX
# Name: state, dtype: object
在pandas.Series中选择行时的隐式类型转换
当loc或iloc中的pandas.Series选择并获取一行时,数据类型dtype是统一的,因此,如果原始pandas.DataFrame的每一列的数据类型不同,则会执行隐式类型转换。
以pandas.DataFrame为例,其中有一列整数int和一列浮点数。
df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
print(df_mix)
# col_int col_float
# A 0 0.1
# B 1 0.2
# C 2 0.3
print(df_mix.dtypes)
# col_int int64
# col_float float64
# dtype: object
使用loc或iloc提取一行将导致float pandas.Series。 int列中的元素将转换为float。
print(df_mix.loc['B'])
# col_int 1.0
# col_float 0.2
# Name: B, dtype: float64
print(type(df_mix.loc['B']))
# <class 'pandas.core.series.Series'>
如果按如下所示编写[],则将pandas.Series元素转换为float。请注意,元素的值将以与原始类型不同的类型获得。
print(df_mix.loc['B']['col_int'])
# 1.0
print(type(df_mix.loc['B']['col_int']))
# <class 'numpy.float64'>
如上所述,最好使用at和iat而不是重复编写[],loc和iloc。如果是at或iat,则可以获取原始类型的元素。
print(df_mix.at['B', 'col_int'])
# 1
print(type(df_mix.at['B', 'col_int']))
# <class 'numpy.int64'>
如果在loc或iloc中指定一个包含1个元素的列表,它将是一行的pandas.DataFrame而不是pandas.Series。当然,在这种情况下,将保留原始数据类型dtype。
print(df_mix.loc[['B']])
# col_int col_float
# B 1 0.2
print(type(df_mix.loc[['B']]))
# <class 'pandas.core.frame.DataFrame'>
print(df_mix.loc[['B']].dtypes)
# col_int int64
# col_float float64
# dtype: object
来源:https://blog.csdn.net/qq_18351157/article/details/104838924


猜你喜欢
- 有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到。而
- 在页面展示json成树形结构时,往往得到的json不是ztree的规范格式,需要对json循环迭代解析。即使不规范的json也可
- 当前,数据可视化已经成为数据科学领域非常重要的一部分。不同网络系统中产生的数据,都需要经过适当的可视化处理,以便更好的呈现给用户读取和分析。
- 实例如下所示:#coding=utf-8import jsonimport geventfrom django.http import Ht
- 本文实例讲述了js鼠标滑过图片震动特效的方法。分享给大家供大家参考。具体实现方法如下:<html><head><
- SQL Server数据库动态交叉表的参考示例:--建立测试环境set nocount oncreate table test(model
- 函数形式:index_select( dim, index)参数:dim:表示从第几维挑选数据,类型为int值;index:表示从第一个参数
- 今天为大家介绍几个Python“装逼”实例代码,python绘制樱花、玫瑰、圣诞树代码实例,主要使用了turtle库Python绘制樱花代码
- 前言:写小程序时,遇到个需要自定义回归时间的场景,下面是实现的效果图。 于我需求而言,我只需要用到fixed_in
- Git 恢复到之前版本1. 应用场景进行了错误提交,需要将代码回退至某个版本;或者需要检出某个版本的代码,再切换回最新版本。2. 解决方法2
- 本文实例讲述了Python3访问并下载网页内容的方法。分享给大家供大家参考。具体如下:#!/usr/local/bin/python3.2i
- 这是支持的下载版本,去官网下载2020.3及以上(2021-03-18测试破解有效)官网下载地址:https://www.jetbrains
- 本文介绍了vue生成随机验证码的示例代码,分享给大家,具体如下:样式自调,最终效果如图:实现效果:点击右边input框会自动切换,如果输入的
- 方案有很多种,我这里简单说一下:1. into outfileSELECT * FROM mytable  
- Web Forms 2.0 是一个很有意思的东东,是 HTML 5 的组成部分。它的目标是提升表单的使用性 (usability),基本上就
- 一、多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',
- 前言在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和
- 马上就要过节了,想把自己的项目搞得酷炫一些,对整个网站的按钮添加图标、飘花效果、首屏大图展示、顶部导航背景图,于是就写了这一遍文字,如有兴趣
- 一、multiprocess模块multiprocess不是一个模块而是python中一个操作、管理进程的包。子模块分为四个部分:创建进程部
- 第1题:Python里面如何实现tuple和list的转换?函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tu