selectstudent_id,student_namefromexam_scoreswherechinese>=90andmath>=90
上面的 SQL 語句表示從考試成績表 (exam_scores) 中郊尝,篩選出語文和數(shù)學(xué)都大于或等于 90 分的所有學(xué)生 id 和 name蝶缀。學(xué)習(xí) pandas 數(shù)據(jù)獲取人灼,推薦這種以數(shù)據(jù)處理的目標(biāo)為導(dǎo)向的方式,而不是被動的按 pandas 提供的loc,iloc的語法中瓦阐,一條條順序?qū)W習(xí)调榄。
本篇我們要分析的關(guān)于銷售數(shù)量和金額的一組數(shù)據(jù),數(shù)據(jù)存放在 csv 文件中。示例數(shù)據(jù)我在github上放了一份唆姐,方便大家對照練習(xí)。
選擇列
以下兩種方法返回Series類型:
importpandasaspddf=pd.read_csv('sample-salesv3.csv')df.name# 或者df['name']
如果需要返回DataFrame格式廓八,使用 list 作為參數(shù)奉芦。為了方便說明,給出在 jupyter notebook 中顯示的界面剧蹂。
如果需要選取多列声功,傳給DataFrame一個包含列名的 list:
選擇行
假設(shè)我們要篩選quantity < 0的所有記錄:
按多條件篩選的處理方式。假設(shè)想篩選quantity < 0并且unit price > 50的所有記錄:
代碼:
criteria=(df['quantity']<0)&(df['unit price']>50)df[criteria].head()
在 pandas 中宠叼,AND 條件的運算符為&先巴,OR 條件的運算符為|。假設(shè)想篩選所有quantity > 30或unit price > 50的記錄:
代碼:
criteria=(df['quantity']>30)|(df['unit price']>50)df[criteria].head()
基于字符串的記錄篩選
如果篩選條件為基于字符串冒冬,可以使用用Series.str.xxx方法伸蚯,主要有startswith,endswith和contains等。舉一個例子简烤,篩選出所有name含有White的記錄:
代碼:
criteria=df['name'].str.contains('White')df[criteria].head()
這里解釋一下 pandas布爾索引(boolean indexing) 的概念剂邮。布爾索引的意思是首先構(gòu)建一個與DataFrame的 index 長度相同的一個 boolean 向量 (boolean vector),這個向量中只包含 True 或者 False横侦,布爾索引是一個Series抗斤。然后DataFrame在篩選的時候,基于DataFrame的行索引丈咐,當(dāng)布爾索引相同行索引所在行的 value 為 True 時,DataFrame的這一行就包含在篩選之中龙宏,否則就排除在外棵逊。
為了能看得更加清晰,我們把上面的例子用另外一個方法來展示银酗。創(chuàng)建一個新列:is_selected辆影,這一列是一個布爾索引。
df['is_selected']=df['name'].str.contains('White')
我們看到黍特,is_selected由 True 和 False 構(gòu)成蛙讥。
構(gòu)建了is_selected列之后,通過df[df['name'].str.contains('White')]篩選與下面的語句作用相同:
df[df['is_selected']==True]
可以把df['name'].str.contains('White')這個布爾索引理解為構(gòu)建了一個新列灭衷,然后基于這一列進行篩選次慢。
基于 DateTime 類型的記錄篩選
如果列的類型是DateTime類型,比如本示例的date列。pandas 讀取 csv 文件時迫像,date 列是 str 類型劈愚,所以我們先將 date 列轉(zhuǎn)換成 datetime 類型,然后基于 pandas 的Timestamp類型構(gòu)建篩選條件闻妓。
# 將 date 列轉(zhuǎn)換成 datetime 類型df['date']=pd.to_datetime(df['date'])# 篩選條件為日期大于 2014/4/1criteria=df['date']>pd.Timestamp(2014,4,1)df[criteria].head()
同時選擇行和列
如果基于本篇所說的模式菌羽,同時選擇行和列,最簡單的方法是組合由缆,比如先基于行構(gòu)建DataFrame注祖,然后再基于這個DataFrame選取需要的列:
where=df['name'].str.contains('White')cols=['name','quantity','unit price','ext price']df[where][cols].head()