Pandas通過index選擇并獲取行和列
通過指定pandas.DataFrame和pandas.Series的index(下標(biāo)),可以選擇和獲取行/列或元素的值。根據(jù)[]中指定的值的類型,可以獲取的數(shù)據(jù)會有所不同。
將描述以下內(nèi)容。
獲取pandas.DataFrame的列
- 列名稱:將單個列作為pandas.Series獲得
- 列名稱的列表:將單個或多個列作為pandas.DataFrame獲得
獲取pandas.DataFrame的行
- 行名?行號的切片:將單行或多行作為pandas.DataFrame獲得
獲取pandas.Series的值
- 標(biāo)簽名稱:獲取每種類型的單個元素的值
- 標(biāo)簽名稱/編號列表:將單個或多個元素的值作為pandas.Series獲得
- 標(biāo)簽名稱/數(shù)字切片:將單個元素或多個元素的值作為pandas.Series獲得
獲取pandas.DataFrame元素的值
行名/列名是整數(shù)值時的注意事項(xiàng)
在pandas.DataFrame的情況下,如果您不習(xí)慣該規(guī)范,則會感到困惑,例如,獲取列作為列表,獲取行作為切片。通過使用at,iat,loc和iloc,可以更清楚地選擇范圍。您還可以使用pandas.DataFrame,切片列提取元素值,并按行名/行號或列表選擇行。
請參閱以下文章。
Pandas獲取和修改任意位置的值(at,iat,loc,iloc)
在此示例代碼中,read_csv讀取并使用以下csv數(shù)據(jù)。
import pandas as pd df = pd.read_csv('./data/28/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
還可以使用set_index()將現(xiàn)有的DataFrame列指定為索引。
Pandas.DataFrame,重置列的行名(set_index)
獲取pandas.DataFrame的列
列名稱:將單個列作為pandas.Series獲得
如果僅在[]中指定列名(列標(biāo)簽),則將提取所選列并將其作為pandas.Series獲取。
print(df['age']) print(type(df['age'])) # name # Alice ? ? ?24 # Bob ? ? ? ?42 # Charlie ? ?18 # Dave ? ? ? 68 # Ellen ? ? ?24 # Frank ? ? ?30 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'> print(df.age) print(type(df.age)) # name # Alice ? ? ?24 # Bob ? ? ? ?42 # Charlie ? ?18 # Dave ? ? ? 68 # Ellen ? ? ?24 # Frank ? ? ?30 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'>
列名稱的列表:將單個或多個列作為pandas.DataFrame獲得
如果指定列名列表,則將提取選定的多個列并將其檢索為pandas.DataFrame。
print(df[['age', 'point']]) print(type(df[['age', 'point']])) # age point # name # Alice 24 64 # Bob 42 92 # Charlie 18 70 # Dave 68 70 # Ellen 24 88 # Frank 30 57 # <class 'pandas.core.frame.DataFrame'>
即使在具有一個元素的列表的情況下,它也成為pandas.DataFrame的一列。不是pandas.Series。
print(df[['age']]) print(type(df[['age']])) # age # name # Alice 24 # Bob 42 # Charlie 18 # Dave 68 # Ellen 24 # Frank 30 # <class 'pandas.core.frame.DataFrame'>
如果是切片,它將是一個空的pandas.DataFrame。因?yàn)榍衅灰暈樾幸?guī)范(請參見下文)。
print(df['age':'point']) # Empty DataFrame # Columns: [age, state, point] # Index: []
也可以使用loc進(jìn)行列切片。另外,如果使用iloc,則可以按列號而不是列名(列標(biāo)簽)指定。有關(guān)詳細(xì)信息,請參見以下文章。
Pandas獲取和修改任意位置的值(at,iat,loc,iloc
print(df.loc[:, 'age':'point']) print(type(df.loc[:, 'age':'point'])) # ? ? ? ? ?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 # <class 'pandas.core.frame.DataFrame'> print(df.iloc[:, [0, 2]]) print(type(df.iloc[:, [0, 2]])) # ? ? ? ? ?age ?point # name ? ? ? ? ? ? ?? # Alice ? ? 24 ? ? 64 # Bob ? ? ? 42 ? ? 92 # Charlie ? 18 ? ? 70 # Dave ? ? ?68 ? ? 70 # Ellen ? ? 24 ? ? 88 # Frank ? ? 30 ? ? 57 # <class 'pandas.core.frame.DataFrame'>
獲取pandas.DataFrame的行
行名?行號的切片:將單行或多行作為pandas.DataFrame獲得
如果在[]中指定切片,則可以提取并獲取相應(yīng)范圍內(nèi)的多行作為pandas.DataFrame。
print(df[1:4]) print(type(df[1:4])) # age state point # name # Bob 42 CA 92 # Charlie 18 CA 70 # Dave 68 TX 70 # <class 'pandas.core.frame.DataFrame'>
可以指定一個負(fù)值或指定一個步驟,例如start:stop:step。您可以提取并獲得奇數(shù)或偶數(shù)行。
print(df[:-3]) print(type(df[1:-3])) # ? ? ? ? ?age state ?point # name ? ? ? ? ? ? ? ? ? ?? # Alice ? ? 24 ? ?NY ? ? 64 # Bob ? ? ? 42 ? ?CA ? ? 92 # Charlie ? 18 ? ?CA ? ? 70 # <class 'pandas.core.frame.DataFrame'> print(df[::2]) print(type(df[::2])) # ? ? ? ? ?age state ?point # name ? ? ? ? ? ? ? ? ? ?? # Alice ? ? 24 ? ?NY ? ? 64 # Charlie ? 18 ? ?CA ? ? 70 # Ellen ? ? 24 ? ?CA ? ? 88 # <class 'pandas.core.frame.DataFrame'> print(df[1::2]) print(type(df[1::2])) # ? ? ? ?age state ?point # name ? ? ? ? ? ? ? ? ?? # Bob ? ? 42 ? ?CA ? ? 92 # Dave ? ?68 ? ?TX ? ? 70 # Frank ? 30 ? ?NY ? ? 57 # <class 'pandas.core.frame.DataFrame'>
如果它不是切片,則它是無用的;如果直接指定行號,則會發(fā)生錯誤。
# print(df[1]) # KeyError: 1
即使只選擇了一行,您也可以獲得pandas.DataFrame。它不會成為pandas.Series。
print(df[1:2]) print(type(df[1:2])) # ? ? ? age state ?point # name ? ? ? ? ? ? ? ? ? # Bob ? ?42 ? ?CA ? ? 92 # <class 'pandas.core.frame.DataFrame'> print(df['Bob':'Ellen']) print(type(df['Bob':'Ellen'])) # ? ? ? ? ?age state ?point # name ? ? ? ? ? ? ? ? ? ?? # Bob ? ? ? 42 ? ?CA ? ? 92 # Charlie ? 18 ? ?CA ? ? 70 # Dave ? ? ?68 ? ?TX ? ? 70 # Ellen ? ? 24 ? ?CA ? ? 88 # <class 'pandas.core.frame.DataFrame'>
如果使用loc或iloc,則可以為一行單獨(dú)指定行名和行號,并將其獲取為pandas.Series,也可以在列表中選擇多行。
print(df.loc['Bob']) print(type(df.loc['Bob'])) # age ? ? ?42 # state ? ?CA # point ? ?92 # Name: Bob, dtype: object # <class 'pandas.core.series.Series'> print(df.loc[['Bob', 'Ellen']]) print(type(df.loc[['Bob', 'Ellen']])) # ? ? ? ?age state ?point # name ? ? ? ? ? ? ? ? ?? # Bob ? ? 42 ? ?CA ? ? 92 # Ellen ? 24 ? ?CA ? ? 88 # <class 'pandas.core.frame.DataFrame'> print(df.iloc[[1, 4]]) print(type(df.iloc[[1, 4]])) # ? ? ? ?age state ?point # name ? ? ? ? ? ? ? ? ?? # Bob ? ? 42 ? ?CA ? ? 92 # Ellen ? 24 ? ?CA ? ? 88 # <class 'pandas.core.frame.DataFrame'>
獲取pandas.Series的值
以以下pandas.Series為例。
s = df['age'] print(s) # name # Alice 24 # Bob 42 # Charlie 18 # Dave 68 # Ellen 24 # Frank 30 # Name: age, dtype: int64
標(biāo)簽名稱:獲取每種類型的單個元素的值
如果標(biāo)簽名稱/編號是獨(dú)立指定的,則可以按原樣獲得該值。如果是數(shù)字,則可以從末尾開始使用負(fù)值指定位置。 -1是結(jié)尾(最后一個)。
也可以在后面指定標(biāo)簽名稱,就像pandas.DataFrame的列名稱規(guī)范一樣。但是,請注意,如果列名與現(xiàn)有方法名或?qū)傩悦丿B,則將優(yōu)先使用。
print(s[3]) print(type(s[3])) # 68 # <class 'numpy.int64'> print(s['Dave']) print(type(s['Dave'])) # 68 # <class 'numpy.int64'> print(s[-1]) print(type(s[-1])) # 30 # <class 'numpy.int64'> print(s.Dave) print(type(s.Dave)) # 68 # <class 'numpy.int64'>
標(biāo)簽名稱/編號列表:將單個或多個元素的值作為pandas.Series獲得
在列表的情況下,可以將多個選定的值作為pandas.Series獲得。
print(s[[1, 3]]) print(type(s[[1, 3]])) # name # Bob ? ? 42 # Dave ? ?68 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'> print(s[['Bob', 'Dave']]) print(type(s[['Bob', 'Dave']])) # name # Bob ? ? 42 # Dave ? ?68 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'>
對于具有1個元素的列表,它是pandas.Series,具有1個元素,而不是元素本身。
print(s[[1]]) print(type(s[[1]])) # name # Bob ? ?42 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'> print(s[['Bob']]) print(type(s[['Bob']])) # name # Bob ? ?42 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'>
標(biāo)簽名稱/數(shù)字切片:將單個元素或多個元素的值作為pandas.Series獲得
在切片的情況下,可以將多個選定值作為pandas.Series獲得。如果是標(biāo)簽名稱的一部分,則還會選擇停止線。
print(s[1:3]) print(type(s[1:3])) # name # Bob ? ? ? ?42 # Charlie ? ?18 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'> print(s['Bob':'Dave']) print(type(s['Bob':'Dave'])) # name # Bob ? ? ? ?42 # Charlie ? ?18 # Dave ? ? ? 68 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'>
當(dāng)選擇一個元件,它變得與pandas.Series一種元素。
print(s[1:2]) print(type(s[1:2])) # name # Bob ? ?42 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'> print(s['Bob':'Bob']) print(type(s['Bob':'Bob'])) # name # Bob ? ?42 # Name: age, dtype: int64 # <class 'pandas.core.series.Series'>
獲取pandas.DataFrame元素的值
通過從pandas.DataFrame中提取pandas.Series,然后從該pandas.Series中選擇并獲取值,可以從pandas.DataFrame中獲取元素值。
print(df['age']['Alice']) # 24
還可以組合切片和列表以提取任何范圍。
print(df['Bob':'Dave'][['age', 'point']]) # age point # name # Bob 42 92 # Charlie 18 70 # Dave 68 70
但是,這種重復(fù)索引引用([…])的方法稱為鏈?zhǔn)剿饕?,因此不建議使用,因?yàn)樵跒檫x擇分配值時可能發(fā)生SettingWithCopyWarning。 …
可以使用at,iat,loc和iloc一次指定行和列。這是優(yōu)選的。
print(df.at['Alice', 'age']) # 24 print(df.loc['Bob':'Dave', ['age', 'point']]) # ? ? ? ? ?age ?point # name ? ? ? ? ? ? ?? # Bob ? ? ? 42 ? ? 92 # Charlie ? 18 ? ? 70 # Dave ? ? ?68 ? ? 70
行名/列名是整數(shù)值時的注意事項(xiàng)
在到目前為止的示例中,行名/列名是字符串,但是當(dāng)行名/列名是整數(shù)值時要小心。
以下面的pandas.DataFrame為例。
df = pd.DataFrame([[0, 10, 20], [30, 40, 50], [60, 70, 80]], index=[2, 0, 1], columns=[1, 2, 0]) print(df) # 1 2 0 # 2 0 10 20 # 0 30 40 50 # 1 60 70 80
在[標(biāo)量值]和[列表]的情況下,指定的值被視為列名。
print(df[0]) # 2 ? ?20 # 0 ? ?50 # 1 ? ?80 # Name: 0, dtype: int64 print(df[[0, 2]]) # ? ? 0 ? 2 # 2 ?20 ?10 # 0 ?50 ?40 # 1 ?80 ?70
對于“切片”,將指定的值視為行號,而不是行名。負(fù)值也可以使用。 打?。╠f [:2])
print(df[:2]) # ? ? 1 ? 2 ? 0 # 2 ? 0 ?10 ?20 # 0 ?30 ?40 ?50 print(df[-2:]) # ? ? 1 ? 2 ? 0 # 0 ?30 ?40 ?50 # 1 ?60 ?70 ?80
使用loc(行名)iloc(行號)來明確指定它是行名還是行號。
print(df.loc[:2]) # ? ?1 ? 2 ? 0 # 2 ?0 ?10 ?20 print(df.iloc[:2]) # ? ? 1 ? 2 ? 0 # 2 ? 0 ?10 ?20 # 0 ?30 ?40 ?50 s = df[2] print(s) # 2 ? ?10 # 0 ? ?40 # 1 ? ?70 # Name: 2, dtype: int64
pandas.Series認(rèn)為指定的值是標(biāo)簽名稱而不是數(shù)字。
print(s[0]) # 40
使用at和iat可以清楚地指定標(biāo)簽名稱或編號。 loc和iloc很好,但是at和iat更快。
print(s.at[0]) # 40 print(s.iat[0]) # 10
特別要注意的是,如果嘗試獲取最后一個值并嘗試獲取[-1],它將被視為對名為-1的標(biāo)簽的值的選擇。確定,如果您使用iat。
# print(s[-1]) # KeyError: -1 print(s.iat[-1]) # 70
這樣,當(dāng)行名和列名是整數(shù)值時,最好使用at,iat,loc和iloc以避免混淆。
到此這篇關(guān)于Pandas通過index選擇并獲取行和列的文章就介紹到這了,更多相關(guān)Pandas index獲取行和列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于python tkinter的點(diǎn)名小程序功能的實(shí)例代碼
這篇文章主要介紹了基于python tkinter的點(diǎn)名小程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08詳細(xì)介紹pandas的DataFrame的append方法使用
這篇文章主要介紹了詳細(xì)介紹pandas的DataFrame的append方法使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07numpy.random.seed()的使用實(shí)例解析
這篇文章主要介紹了numpy.random.seed()的使用實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02TensorFlow實(shí)現(xiàn)AutoEncoder自編碼器
這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)AutoEncoder自編碼器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03python 圖像判斷,清晰度(明暗),彩色與黑白實(shí)例
這篇文章主要介紹了python 圖像判斷,清晰度(明暗),彩色與黑白實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06