Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)
前言
要在pandas.DataFrame中的任何位置檢索或更改數(shù)據(jù),可以使用at,iat,loc,iloc。
- 位置的指定方法
- at,loc:行標(biāo)簽(行名),列標(biāo)簽(列名)
- iat,iloc:行號(hào),列號(hào)
- 選擇和獲取/更改的數(shù)據(jù)
- at,iat:?jiǎn)蝹€(gè)元素的值
- loc,iloc:?jiǎn)蝹€(gè)元素和多個(gè)元素值
- 選擇的行/列的獲取和修改
- 列表和切片的范圍指定
- 其他
- at和iat的處理速度比loc和iloc更快
- 如果要通過(guò)組合標(biāo)簽和數(shù)字來(lái)指定位置,請(qǐng)?jiān)趇ndex或column處或loc處組合(末尾說(shuō)明)
在此將描述以下內(nèi)容。
- at,iat:選擇,獲取和更改單個(gè)元素的值
- loc,iloc:選擇,獲取和更改單個(gè)和多個(gè)元素的值
- 選擇單個(gè)元素的值
- 選擇多個(gè)元素值
- 選擇行/列
- 當(dāng)行名和列名具有重復(fù)值時(shí)
- 通過(guò)數(shù)字和標(biāo)簽指定位置
- 在pandas.Series中選擇行時(shí)的隱式類(lèi)型轉(zhuǎn)換
還可以使用直接索引df []選擇/獲取pandas.DataFrame的行/列和pandas.Series的元素值。
在此示例代碼中,將以下csv數(shù)據(jù)與read_csv結(jié)合使用。
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
第一列設(shè)置為參數(shù)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
行標(biāo)簽(索引)和列標(biāo)簽(列)的值如下。
print(df.index.values) # ['Alice' 'Bob' 'Charlie' 'Dave' 'Ellen' 'Frank'] print(df.columns.values) # ['age' 'state' 'point']
at,iat:選擇,獲取和更改單個(gè)元素的值
at通過(guò)行標(biāo)簽和列標(biāo)簽指定位置。除了獲取數(shù)據(jù)之外,還可以在該位置設(shè)置(替換)新值。
print(df.at['Bob', 'age']) print(df.at['Dave', 'state']) # 42 # TX df.at['Bob', 'age'] = 60 print(df.at['Bob', 'age']) # 60
iat通過(guò)行號(hào)和列號(hào)指定位置。行號(hào)和列號(hào)以0開(kāi)頭。
iat和at一樣,iat不僅可以獲取數(shù)據(jù),而且可以在該位置設(shè)置(替代)新值。
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:選擇,獲取和更改單個(gè)和多個(gè)元素的值
loc和iloc通過(guò)指定范圍不僅可以選擇單個(gè)值,還可以選擇多個(gè)數(shù)據(jù)。
loc通過(guò)行和列標(biāo)簽指定位置,而iloc通過(guò)行和列編號(hào)指定位置。
選擇單個(gè)元素的值
訪問(wèn)單個(gè)值時(shí),它與at和iat相同。 但at和iat的處理速度更快。
print(df.loc['Bob', 'age']) print(df.iloc[3, 1]) # 42 # TX
除了查看數(shù)據(jù)外,還可以在該位置設(shè)置(替換)新值。
df.loc['Bob', 'age'] = 60 print(df.loc['Bob', 'age']) # 60 df.iloc[1, 0] = 42 print(df.iloc[1, 0]) # 42
選擇多個(gè)元素值
要訪問(wèn)多個(gè)值,在列表[x,y]或切片[start:stop:step]中指定數(shù)據(jù)的范圍和位置。引用的值將是pandas.Series或pandas.DataFrame。
切片的寫(xiě)入方式與普通切片相同。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,則可以提取并獲取奇數(shù)或偶數(shù)行。
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'>
可以一次更改多個(gè)值。
print(df.loc['Bob':'Dave', 'age']) # name # Bob 20 # Charlie 30 # Dave 40 # Name: age, dtype: int64
選擇行/列
若要選擇行或列,可以使用直接索引引用df [],但只能在以下指定方法中使用。
- 行選擇:行名和行號(hào)的切片
- 列選擇:列名稱或列名稱列表
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
當(dāng)使用loc和iloc選擇行或列時(shí),可以比索引參考df []更靈活地指定它。
在loc和iloc中省略該列,則它將是行引用??梢赃x擇無(wú)法通過(guò)索引引用完成的單行,也可以選擇列表中的多行。
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'>
可以通過(guò)將行規(guī)范設(shè)置為loc和iloc中的(整個(gè)切片)來(lái)引用列??梢允褂盟饕脽o(wú)法完成的切片。也可以在iloc中使用列號(hào)。
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'>
當(dāng)行名和列名具有重復(fù)值時(shí)
具有重復(fù)值的行和列也可以在index和columns中指定。
例,其中將具有重復(fù)值的列指定為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']
如果在中指定重復(fù)的列名,則numpy.ndarray中將返回多個(gè)值。
print(df_state.at['NY', 'age']) print(type(df_state.at['NY', 'age'])) # [24 30] # <class 'numpy.ndarray'>
如果在loc中指定重復(fù)的列名,則它將在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中指定列號(hào)時(shí),即使值重復(fù)也沒(méi)有關(guān)系。
print(df_state.iat[0, 1]) # 24
可以使用index.is_unique和column.is_unique檢查列標(biāo)簽和行標(biāo)簽是否具有唯一值(不重復(fù))。
print(df_state.index.is_unique) # False print(df_state.columns.is_unique) # True
通過(guò)數(shù)字和標(biāo)簽指定位置
如果要使用數(shù)字和標(biāo)簽(例如行號(hào)和列標(biāo)簽)的組合指定位置,則可以在at或loc處使用索引或列。可以按索引或列從行號(hào)或列號(hào)中獲取行標(biāo)簽和列標(biāo)簽。
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,可以通過(guò)數(shù)字和標(biāo)簽的組合來(lái)指定位置。
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進(jìn)行指定時(shí),如果loc使用行標(biāo)簽/列標(biāo)簽,則直到停止為止,但如果iloc使用行號(hào)/列編號(hào),則將直到停止前成為請(qǐng)注意,如果要將stop的值從數(shù)字轉(zhuǎn)換為標(biāo)簽,則需要執(zhí)行類(lèi)似索引[n-1]的操作。
另外,如下所述,當(dāng)選擇一行時(shí),可以執(zhí)行隱式類(lèi)型轉(zhuǎn)換。 最好使用上面顯示的索引和列將它們組合為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中選擇行時(shí)的隱式類(lèi)型轉(zhuǎn)換
當(dāng)loc或iloc中的pandas.Series選擇并獲取一行時(shí),數(shù)據(jù)類(lèi)型dtype是統(tǒng)一的,因此,如果原始pandas.DataFrame的每一列的數(shù)據(jù)類(lèi)型不同,則會(huì)執(zhí)行隱式類(lèi)型轉(zhuǎn)換。
以pandas.DataFrame為例,其中有一列整數(shù)int和一列浮點(diǎn)數(shù)。
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提取一行將導(dǎo)致float pandas.Series。 int列中的元素將轉(zhuǎn)換為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'>
如果按如下所示編寫(xiě)[],則將pandas.Series元素轉(zhuǎn)換為float。請(qǐng)注意,元素的值將以與原始類(lèi)型不同的類(lèi)型獲得。
print(df_mix.loc['B']['col_int']) # 1.0 print(type(df_mix.loc['B']['col_int'])) # <class 'numpy.float64'>
如上所述,最好使用at和iat而不是重復(fù)編寫(xiě)[],loc和iloc。如果是at或iat,則可以獲取原始類(lèi)型的元素。
print(df_mix.at['B', 'col_int']) # 1 print(type(df_mix.at['B', 'col_int'])) # <class 'numpy.int64'>
如果在loc或iloc中指定一個(gè)包含1個(gè)元素的列表,它將是一行的pandas.DataFrame而不是pandas.Series。當(dāng)然,在這種情況下,將保留原始數(shù)據(jù)類(lèi)型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
總結(jié)
到此這篇關(guān)于Python Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)的文章就介紹到這了,更多相關(guān)Pandas獲取修改任意位置的值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python控制nao機(jī)器人身體動(dòng)作實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了python控制nao機(jī)器人身體動(dòng)作實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Python使用numpy產(chǎn)生正態(tài)分布隨機(jī)數(shù)的向量或矩陣操作示例
這篇文章主要介紹了Python使用numpy產(chǎn)生正態(tài)分布隨機(jī)數(shù)的向量或矩陣操作,簡(jiǎn)單描述了正態(tài)分布的概念并結(jié)合實(shí)例形式分析了Python使用numpy模塊結(jié)合matplotlib繪制正態(tài)分布曲線圖相關(guān)操作技巧,需要的朋友可以參考下2018-08-08python密碼學(xué)簡(jiǎn)單替代密碼解密及測(cè)試教程
這篇文章主要介紹了python密碼學(xué)簡(jiǎn)單替代密碼解密及測(cè)試教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Numpy截取指定范圍內(nèi)的數(shù)據(jù)方法
今天小編就為大家分享一篇Numpy截取指定范圍內(nèi)的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python3.7實(shí)現(xiàn)中控考勤機(jī)自動(dòng)連接
這篇文章主要為大家詳細(xì)介紹了Python3.7實(shí)現(xiàn)中控考勤機(jī)自動(dòng)連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08python?selenium參數(shù)詳解和實(shí)現(xiàn)案例
這篇文章主要介紹了python?selenium參數(shù)詳解和實(shí)現(xiàn)案例,無(wú)頭模式添加,可以讓selenium模擬登錄,進(jìn)入到后臺(tái)運(yùn)行,本文以登錄打開(kāi)公司內(nèi)網(wǎng)下載數(shù)據(jù)為例,給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10Python實(shí)戰(zhàn)基礎(chǔ)之繪制餅狀圖分析商品庫(kù)存
餅狀圖(pie chart)一般用于描述分類(lèi)型數(shù)據(jù)的相對(duì)頻數(shù)或百分?jǐn)?shù)頻數(shù)分布,呈現(xiàn)部分與總體的關(guān)系,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)基礎(chǔ)之繪制餅狀圖分析商品庫(kù)存的相關(guān)資料,需要的朋友可以參考下2022-07-07