Python Pandas如何获取和修改任意位置的值(at,iat,loc,iloc)

目录
  • 前言
  • at,iat:选择,获取和更改单个元素的值
  • loc,iloc:选择,获取和更改单个和多个元素的值
    • 选择单个元素的值
    • 选择多个元素值
    • 选择行/列
  • 当行名和列名具有重复值时
  • 通过数字和标签指定位置
  • 在pandas.Series中选择行时的隐式类型转换
  • 总结

前言

要在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

总结

到此这篇关于Python Pandas如何获取和修改任意位置的值(at,iat,loc,iloc)的文章就介绍到这了,更多相关Pandas获取修改任意位置的值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pandas DataFrame的修改方法(值、列、索引)

    对于DataFrame的修改操作其实有很多,不单单是某个部分的值的修改,还有一些索引的修改.列名的修改,类型修改等等.我们仅选取部分进行介绍. 一.值的修改 DataFrame的修改方法,其实前面介绍loc方法的时候介绍了一些. 1. loc方法修改 loc方法实际上是定位某个位置的数据的,但是定位完以后就可以对此位置的数据进行修改,使用此方法可以对DataFrame进行的修改如下: 1.对某行.某N行进行修改: 2.对某列.某N列进行修改: 3.对横坐标为某行或某N行,纵坐标为某列或者某N列的

  • Python Pandas如何获取和修改任意位置的值(at,iat,loc,iloc)

    目录 前言 at,iat:选择,获取和更改单个元素的值 loc,iloc:选择,获取和更改单个和多个元素的值 选择单个元素的值 选择多个元素值 选择行/列 当行名和列名具有重复值时 通过数字和标签指定位置 在pandas.Series中选择行时的隐式类型转换 总结 前言 要在pandas.DataFrame中的任何位置检索或更改数据,可以使用at,iat,loc,iloc. 位置的指定方法 at,loc:行标签(行名),列标签(列名) iat,iloc:行号,列号 选择和获取/更改的数据 at,

  • python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现

    相信很多人像我一样在学习python,pandas过程中对数据的选取和修改有很大的困惑(也许是深受Matlab)的影响... 到今天终于完全搞清楚了!!! 先手工生出一个数据框吧 import numpy as np import pandas as pd df = pd.DataFrame(np.arange(0,60,2).reshape(10,3),columns=list('abc')) df 是这样子滴 那么这三种选取数据的方式该怎么选择呢? 一.当每列已有column name时,用

  • Jquery获取和修改img的src值的方法

    获取: 复制代码 代码如下: $("#imgId")[0].src; 修改: 复制代码 代码如下: $("#imgId").attr('src',path);

  • JS获取键盘上任意按键的值(实例代码)

    废话不多说,直接上代码 复制代码 代码如下: function keyUp(){         if(navigator.appName == "Microsoft Internet Explorer"){        var keycode = event.keyCode;                }else{         varkeycode = keyUp.caller.arguments[0].which;            }       alert(key

  • Python Pandas删除替换并提取其中的缺失值NaN(dropna,fillna,isnull)

    目录 前言 Pandas中缺少值NaN的介绍 将缺失值作为Pandas中的缺少值NaN 缺少值NaN的删除方法 删除所有值均缺失的行/列 删除至少包含一个缺失值的行/列 根据不缺少值的元素数量删除行/列 删除特定行/列中缺少值的列/行 pandas.Series 替换(填充)缺失值 用通用值统一替换 为每列替换不同的值 用每列的平均值,中位数,众数等替换 替换为上一个或下一个值 指定连续更换的最大数量 pandas.Series 提取缺失值 提取特定行/列中缺少值的列/行 提取至少包含一个缺失值

  • 详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)

    在操作DataFrame时,肯定会经常用到loc,iloc,at等函数,各个函数看起来差不多,但是还是有很多区别的,我们一起来看下吧. 首先,还是列出一个我们用的DataFrame,注意index一列,如下: 接下来,介绍下各个函数的用法: 1.loc函数 愿意看官方文档的,请戳这里,这里一般最权威. loc函数是基于"标签"选择数据的,但是也可以接受一个boolean的array,对于每个用法,我们从参数方面来一一举例: 1.1 单个label 接受一个"标签"(

  • Python字典的基本用法实例分析【创建、增加、获取、修改、删除】

    本文实例讲述了Python字典的基本用法.分享给大家供大家参考,具体如下: 字典是一系列的键值对 . 每个键都与一个值相关联, 我们可以使用键来访问与之相关联的值. 与键相关联的值可以任何 Python 对象,比如数字. 字符串. 列表甚至是字典. 1 创建字典 我们举一个英文单词的例子来说明: dict = {'evaporation': '蒸发,发散: 消失: 汽化: 蒸发法', 'carpenter': '木工,木匠'} print('dict=' + str(dict)) 键和值之间用冒

  • Python获取任意xml节点值的方法

    本文实例讲述了Python获取任意xml节点值的方法.分享给大家供大家参考.具体实现方法如下: # -*- coding: utf-8 -*- import xml.dom.minidom ELEMENT_NODE = xml.dom.Node.ELEMENT_NODE class SimpleXmlGetter(object): def __init__(self, data): if type(data) == str: self.root = xml.dom.minidom.parse(d

  • python实现任意位置文件分割的实例

    应用场景 在嵌入式开发中,常常需要将一个binary文件分割成多个文件,或者将一个binary的某块区域抓成一个单独文件.本篇blog以python为例,实现了以上需求; 实现代码 #!/usr/bin/python """ ./file_split.py, just for testing; """ import sys import os import re from os.path import join from array import

  • Python Pandas 获取列匹配特定值的行的索引问题

    给定一个带有列"BoolCol"的DataFrame,如何找到满足条件"BoolCol" == True的DataFrame的索引 目前有迭代的方式来做到这一点: for i in range(100,3000): if df.iloc[i]['BoolCol']== True: print i,df.iloc[i]['BoolCol'] 这虽然可行,但不是标准的 Pandas 方式.经过一番研究,我目前正在使用这个代码: df[df['BoolCol'] == T

随机推荐