Python|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 statepoint
          name
          Alice24NY64
          Bob42CA92
          Charlie18CA70
          Dave68TX70
          Ellen24CA88
          Frank30NY57
          第一列设置为参数index_col中的index。
          import pandas as pddf = pd.read_csv('./data/04/sample_pandas_normal.csv', index_col=0)print(df)#age statepoint# name# Alice24NY64# Bob42CA92# Charlie18CA70# Dave68TX70# Ellen24CA88# Frank30NY57

          行标签(索引)和列标签(列)的值如下。
          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# TXdf.at['Bob', 'age'] = 60print(df.at['Bob', 'age'])# 60

          iat通过行号和列号指定位置。行号和列号以0开头。
          【Python|Python Pandas如何获取和修改任意位置的值(at,iat,loc,iloc)】iat和at一样,iat不仅可以获取数据,而且可以在该位置设置(替代)新值。
          print(df.iat[1, 0])print(df.iat[3, 1])# 60# TXdf.iat[1, 0] = 42print(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'] = 60print(df.loc['Bob', 'age'])# 60df.iloc[1, 0] = 42print(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# Bob42# Charlie18# Dave68# Name: age, dtype: int64# print(df.loc[:'Dave', ['age', 'point']])print(type(df.loc[:'Dave', 'age':'point']))#agepoint# name# Alice2464# Bob4292# Charlie1870# Dave6870# print(df.iloc[:3, [0, 2]])print(type(df.iloc[:3, [0, 2]]))#agepoint# name# Alice2464# Bob4292# Charlie1870#

          如果指定了step,则可以提取并获取奇数或偶数行。
          print(df.iloc[::2, 0])print(type(df.iloc[::2, 0]))# name# Alice24# Charlie18# Ellen24# Name: age, dtype: int64# print(df.iloc[1::2, 0])print(type(df.iloc[1::2, 0]))# name# Bob42# Dave68# Frank30# Name: age, dtype: int64#

          可以一次更改多个值。
          print(df.loc['Bob':'Dave', 'age'])# name# Bob20# Charlie30# Dave40# Name: age, dtype: int64


          选择行/列
          若要选择行或列,可以使用直接索引引用df [],但只能在以下指定方法中使用。
          • 行选择:行名和行号的切片
          • 列选择:列名称或列名称列表
          print(df['Bob':'Ellen'])#age statepoint# name# Bob20CA92# Charlie30CA70# Dave40TX70# Ellen24CA88print(df[:3])#age statepoint# name# Alice24NY64# Bob20CA92# Charlie30CA70print(df['age'])# name# Alice24# Bob20# Charlie30# Dave40# Ellen24# Frank30# Name: age, dtype: int64print(df[['age', 'point']])#agepoint# name# Alice2464# Bob2092# Charlie3070# Dave4070# Ellen2488# Frank3057

          当使用loc和iloc选择行或列时,可以比索引参考df []更灵活地指定它。
          在loc和iloc中省略该列,则它将是行引用。可以选择无法通过索引引用完成的单行,也可以选择列表中的多行。
          print(df.loc['Bob'])print(type(df.loc['Bob']))# age20# stateCA# point92# Name: Bob, dtype: object# print(df.iloc[[1, 4]])print(type(df.iloc[[1, 4]]))#age statepoint# name# Bob20CA92# Ellen24CA88#

          可以通过将行规范设置为loc和iloc中的(整个切片)来引用列。可以使用索引引用无法完成的切片。也可以在iloc中使用列号。
          print(df.loc[:, 'age':'point'])print(type(df.loc[:, 'age':'point']))#age statepoint# name# Alice24NY64# Bob20CA92# Charlie30CA70# Dave40TX70# Ellen24CA88# Frank30NY57# print(df.iloc[:, [0, 2]])print(type(df.iloc[:, [0, 2]]))#agepoint# name# Alice2464# Bob2092# Charlie3070# Dave4070# Ellen2488# Frank3057#


          当行名和列名具有重复值时 具有重复值的行和列也可以在index和columns中指定。
          例,其中将具有重复值的列指定为index。
          df_state = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=2)print(df_state)#nameagepoint# state# NYAlice2464# CABob4292# CACharlie1870# TXDave6870# CAEllen2488# NYFrank3057print(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]#

          如果在loc中指定重复的列名,则它将在pandas.DataFrame或pandas.Series中返回。
          print(df_state.loc['NY', 'age'])print(type(df_state.loc['NY', 'age']))# state# NY24# NY30# Name: age, dtype: int64# print(df_state.loc['NY', ['age', 'point']])print(type(df_state.loc['NY', ['age', 'point']]))#agepoint# state# NY2464# NY3057#

          在iat或iloc中指定列号时,即使值重复也没有关系。
          print(df_state.iat[0, 1])# 24

          可以使用index.is_unique和column.is_unique检查列标签和行标签是否具有唯一值(不重复)。
          print(df_state.index.is_unique)# Falseprint(df_state.columns.is_unique)# True


          通过数字和标签指定位置 如果要使用数字和标签(例如行号和列标签)的组合指定位置,则可以在at或loc处使用索引或列。可以按索引或列从行号或列号中获取行标签和列标签。
          print(df)#age statepoint# name# Alice24NY64# Bob20CA92# Charlie30CA70# Dave40TX70# Ellen24CA88# Frank30NY57print(df.index[2])# Charlieprint(df.columns[1])# state

          使用at或loc,可以通过数字和标签的组合来指定位置。
          print(df.at[df.index[2], 'age'])# 30print(df.loc[['Alice', 'Dave'], df.columns[1]])# name# AliceNY# DaveTX# Name: state, dtype: object

          在使用slice start:stop:step进行指定时,如果loc使用行标签/列标签,则直到停止为止,但如果iloc使用行号/列编号,则将直到停止前成为请注意,如果要将stop的值从数字转换为标签,则需要执行类似索引[n-1]的操作。
          另外,如下所述,当选择一行时,可以执行隐式类型转换。 最好使用上面显示的索引和列将它们组合为at或loc。
          print(df['age'][2])# 30print(df.age[2])# 30print(df.loc[['Alice', 'Dave']].iloc[:, 1])# name# AliceNY# DaveTX# 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_intcol_float# A00.1# B10.2# C20.3print(df_mix.dtypes)# col_intint64# col_floatfloat64# dtype: object

          使用loc或iloc提取一行将导致float pandas.Series。 int列中的元素将转换为float。
          print(df_mix.loc['B'])# col_int1.0# col_float0.2# Name: B, dtype: float64print(type(df_mix.loc['B']))#

          如果按如下所示编写[],则将pandas.Series元素转换为float。请注意,元素的值将以与原始类型不同的类型获得。
          print(df_mix.loc['B']['col_int'])# 1.0print(type(df_mix.loc['B']['col_int']))#

          如上所述,最好使用at和iat而不是重复编写[],loc和iloc。如果是at或iat,则可以获取原始类型的元素。
          print(df_mix.at['B', 'col_int'])# 1print(type(df_mix.at['B', 'col_int']))#

          如果在loc或iloc中指定一个包含1个元素的列表,它将是一行的pandas.DataFrame而不是pandas.Series。当然,在这种情况下,将保留原始数据类型dtype。
          print(df_mix.loc[['B']])#col_intcol_float# B10.2print(type(df_mix.loc[['B']]))# print(df_mix.loc[['B']].dtypes)# col_intint64# col_floatfloat64# dtype: object


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

            推荐阅读