pandas讀取Excel、csv文件中的數據時,得到的大多是表格型的二維數據,在pandas中對應的即為DataFrame數據結構。在處理這類數據時,往往要根據據需求先獲取數據中的子集,如某些列、某些行、行列交叉的部分等。可以說子集選取是一個非常基礎、頻繁使用的操作,而DataFrame的子集選取 ...
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[]
是更為通用的方法,它支持單個標簽值、列表多選、切片區間、條件(布爾)表達式、函數調用五種方式索引子集,功能強大。