pandas讀取Excel、csv檔案中的資料時,得到的大多是表格型的二維資料,在pandas中對應的即為DataFrame資料結構,在處理這類資料時,往往要根據據需求先獲取資料中的子集,如某些列、某些行、行列交叉的部分等,可以說子集選取是一個非常基礎、頻繁使用的操作,而DataFrame的子集選取看似簡單卻有一定復雜性,本文聚焦DataFrame的子集選取操作邏輯,力求在實戰中遇到子集選取操作的需求時"不迷路",

一、圖解DataFrame
DataFrame是一種二維的表格型資料結構,每一行/列都有對應的標簽和位置序號,行列標簽、位置序號的對應關系如下圖所示:

列標簽(也叫列名:columns) 行標簽(也叫行索引:index)默認為(0, 1, 2, …, n),這里與位置序號恰好一致,
針對DataFrame的資料結構,pandas提供了三種獲取子集的索引器:[]、.loc[]、.iloc[],
df[]:快捷的整行整列選取df.loc[]:按標簽的行列交叉選取df.iloc[]:按位置序號的行列交叉選取
二、整行整列選取:df[]
df['列標簽'],選取單個整列
# 選取“日期”列
df['日期']
df[標簽串列],選取多個整列
# 選取“最高溫”,“最低溫”,“風力風向”三列
df[['最高溫','最低溫','風力風向']]
df[切片],選取整行
# 選取行索引值1、2、3的整行,切片左閉右開
df[1:4]
切片語法也支持字串的索引標簽值,如將"日期"列修改為行索引(index)
df1 = df.set_index("日期")

# 下面兩個切片選取的行是一樣的
df1[1:4] #按位置序號的切片,左閉右開
df1['2021-12-02 周四':'2021-12-04 周六'] # 按行標簽的切片,左閉右閉
df[]語法小結:
df[]語法中,方括號內輸入標簽名或串列選取的是列;而方括號內輸入切片、條件選取的是行(條件篩選在下文單獨介紹),df[]輸入切片選取整行時,如果是按照位置序號的切片,左閉右開;按行標簽的切片,左閉右閉,
三、行列交叉選取
行列交叉選擇,可以通過df.loc[]和df.iloc[]兩個索引器來實作,兩者都需要輸入兩組引數,先行選擇,后列選擇,行、列選擇都可以是單個標簽(序號)、串列和切片,根據需求組合使用,威力強大!
df.loc[行選擇,列選擇],引數面向的是標簽,
df.iloc[行位置序號,列位置序號],引數面向的是位置序號,
行:單個數值,列:單個數值
df1.loc['2021-12-05 周日','空氣質量指數']
df1.iloc[4,4]

行:串列,列:串列
df1.loc[['2021-12-05 周日','2021-12-07 周二'],['最高溫','最低溫','風力風向']]
df1.iloc[[4,6],[0,1,3]]

行:切片,列:切片
df1.loc['2021-12-01 周三':'2021-12-03 周五','天氣':'空氣質量指數']
df1.iloc[:3,2:5]

行:切片(全選),列:串列
df1.loc[:,['最高溫','最低溫']]
df1.iloc[:,[0,1]]

四、按條件篩選子集
df.[]、df.loc[]、df.iloc[]除了按照行列的標簽和位置序號選取子集,還可以使用條件(布爾運算式)篩選子集,
篩選最高溫、最低溫
將最高溫、最低溫處理成數值型:
df1.loc[:,'最高溫'] = df1['最高溫'].str.replace('°','').astype('float32')
df1.loc[:,'最低溫'] = df1['最低溫'].str.replace('°','').astype('float32')

獲取最高溫大于10度,最低溫小于6度的資料
# df.[]的寫法
df1[(df1['最高溫']>10) & (df1['最低溫']<6)]
# df.loc[]的寫法
df1.loc[(df1['最高溫']>10) & (df1['最低溫']<6),:]
# &與、|或、~非
df1.loc[(df1['最高溫']>10) & ~(df1['最低溫']>=6),:]

五、函式篩選子集
# 匿名函式lambda運算式,獲取最高溫大于10度,最低溫小于6度的資料
df1.loc[lambda df : (df['最高溫']>10) & (df['最低溫']<6)]
獲取前9天并且空氣質量指數為優
# 自定義函式,回傳值是布爾陣列
def queryData(df):
return df.index.str.startswith('2021-12-0') & df['空氣質量指數'].str.endswith('優')
df1.loc[queryData , :]

小結
在pandast提供的df[]、df.loc[]、df.iloc[]這個三種索引器,前兩個更為常用,df[]在整行或者整列獲取時更為方便,整行整列選取可以看作是行列交叉選取的一個特例,故df.loc[]是更為通用的方法,它支持單個標簽值、串列多選、切片區間、條件(布爾)運算式、函式呼叫五種方式索引子集,功能強大,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469585.html
標籤:Python
