目录
  • 前言
  • 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获取修改任意位置的值内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!