04 您所在的位置:网站首页 选定范围替换 04

04

2023-11-30 04:21| 来源: 网络整理| 查看: 265

04_Pandas获取和修改任意位置的值(at,iat,loc,iloc)

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

如果指定了step,则可以提取并获取奇数或偶数行。

print(df.iloc[::2, 0]) print(type(df.iloc[::2, 0])) # name # Alice 24 # Charlie 18 # Ellen 24 # Name: age, dtype: int64 # print(df.iloc[1::2, 0]) print(type(df.iloc[1::2, 0])) # name # Bob 42 # Dave 68 # Frank 30 # Name: age, dtype: int64 #

可以一次更改多个值。

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 # print(df.iloc[[1, 4]]) print(type(df.iloc[[1, 4]])) # age state point # name # Bob 20 CA 92 # Ellen 24 CA 88 #

可以通过将行规范设置为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 # 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 # 当行名和列名具有重复值时

具有重复值的行和列也可以在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] #

如果在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 # print(df_state.loc['NY', ['age', 'point']]) print(type(df_state.loc['NY', ['age', 'point']])) # age point # state # NY 24 64 # NY 30 57 #

在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'])) #

如果按如下所示编写[],则将pandas.Series元素转换为float。请注意,元素的值将以与原始类型不同的类型获得。

print(df_mix.loc['B']['col_int']) # 1.0 print(type(df_mix.loc['B']['col_int'])) #

如上所述,最好使用at和iat而不是重复编写[],loc和iloc。如果是at或iat,则可以获取原始类型的元素。

print(df_mix.at['B', 'col_int']) # 1 print(type(df_mix.at['B', 'col_int'])) #

如果在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']])) # print(df_mix.loc[['B']].dtypes) # col_int int64 # col_float float64 # dtype: object


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有