您好,登錄后才能下訂單哦!
本篇內容主要講解“Pandas怎么通過index選擇并獲取行和列”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Pandas怎么通過index選擇并獲取行和列”吧!
通過指定pandas.DataFrame和pandas.Series的index(下標),可以選擇和獲取行/列或元素的值。根據[]中指定的值的類型,可以獲取的數據會有所不同。
將描述以下內容。
獲取pandas.DataFrame的列
列名稱:將單個列作為pandas.Series獲得
列名稱的列表:將單個或多個列作為pandas.DataFrame獲得
獲取pandas.DataFrame的行
行名?行號的切片:將單行或多行作為pandas.DataFrame獲得
獲取pandas.Series的值
標簽名稱:獲取每種類型的單個元素的值
標簽名稱/編號列表:將單個或多個元素的值作為pandas.Series獲得
標簽名稱/數字切片:將單個元素或多個元素的值作為pandas.Series獲得
獲取pandas.DataFrame元素的值
行名/列名是整數值時的注意事項
在pandas.DataFrame的情況下,如果您不習慣該規范,則會感到困惑,例如,獲取列作為列表,獲取行作為切片。通過使用at,iat,loc和iloc,可以更清楚地選擇范圍。您還可以使用pandas.DataFrame,切片列提取元素值,并按行名/行號或列表選擇行。
請參閱以下文章。
Pandas獲取和修改任意位置的值(at,iat,loc,iloc)
在此示例代碼中,read_csv讀取并使用以下csv數據。
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()將現有的DataFrame列指定為索引。
Pandas.DataFrame,重置列的行名(set_index)
如果僅在[]中指定列名(列標簽),則將提取所選列并將其作為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。
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。因為切片被視為行規范(請參見下文)。
print(df['age':'point']) # Empty DataFrame # Columns: [age, state, point] # Index: []
也可以使用loc進行列切片。另外,如果使用iloc,則可以按列號而不是列名(列標簽)指定。有關詳細信息,請參見以下文章。
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。
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'>
可以指定一個負值或指定一個步驟,例如start:stop:step。您可以提取并獲得奇數或偶數行。
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'>
如果它不是切片,則它是無用的;如果直接指定行號,則會發生錯誤。
# 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,則可以為一行單獨指定行名和行號,并將其獲取為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為例。
s = df['age'] print(s) # name # Alice 24 # Bob 42 # Charlie 18 # Dave 68 # Ellen 24 # Frank 30 # Name: age, dtype: int64
如果標簽名稱/編號是獨立指定的,則可以按原樣獲得該值。如果是數字,則可以從末尾開始使用負值指定位置。 -1是結尾(最后一個)。
也可以在后面指定標簽名稱,就像pandas.DataFrame的列名稱規范一樣。但是,請注意,如果列名與現有方法名或屬性名重疊,則將優先使用。
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'>
標簽名稱/編號列表:將單個或多個元素的值作為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'>
在切片的情況下,可以將多個選定值作為pandas.Series獲得。如果是標簽名稱的一部分,則還會選擇停止線。
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'>
當選擇一個元件,它變得與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.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
但是,這種重復索引引用([…])的方法稱為鏈式索引,因此不建議使用,因為在為選擇分配值時可能發生SettingWithCopyWarning。 …
可以使用at,iat,loc和iloc一次指定行和列。這是優選的。
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
在到目前為止的示例中,行名/列名是字符串,但是當行名/列名是整數值時要小心。
以下面的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
在[標量值]和[列表]的情況下,指定的值被視為列名。
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
對于“切片”,將指定的值視為行號,而不是行名。負值也可以使用。 打印(df [: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認為指定的值是標簽名稱而不是數字。
print(s[0]) # 40
使用at和iat可以清楚地指定標簽名稱或編號。 loc和iloc很好,但是at和iat更快。
print(s.at[0]) # 40 print(s.iat[0]) # 10
特別要注意的是,如果嘗試獲取最后一個值并嘗試獲取[-1],它將被視為對名為-1的標簽的值的選擇。確定,如果您使用iat。
# print(s[-1]) # KeyError: -1 print(s.iat[-1]) # 70
這樣,當行名和列名是整數值時,最好使用at,iat,loc和iloc以避免混淆。
到此,相信大家對“Pandas怎么通過index選擇并獲取行和列”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。