了解了 DataFrame 之后垄分,我們開始對(duì)電影數(shù)據(jù)進(jìn)行篩選梅屉。
如果給你一個(gè) Excel 表格舞竿,最容易想到的就是篩選出這個(gè)表格的某幾行或某幾列搀捷,那么在Pandas 中如何做這種篩選呢,可以分為三種情況:
- 按一行或多行篩選
使用非常好用的 loc( ) 函數(shù)其馏,可以按照索引進(jìn)行篩選
import pandas as pd
movie_pd = pd.read_csv('douban_movie.csv', header = 0, sep = '\t')
print movie_pd.loc[0]
print movie_pd.loc[range(10)]
print movie_pd.loc[[1, 3, 8]]
loc( ) 函數(shù)既可以傳入某個(gè)索引值盼铁,也可以傳入索引值的列表,一般情況下尝偎,DataFrame 的索引值是 0 ~ N-1 的數(shù)字 ( 其中 N 為 DataFrame的長(zhǎng)度 )。所以鹏控,loc[0] 查詢的其實(shí)是第一行的數(shù)據(jù)致扯,loc[range(10)] 查詢的是前 10 行的數(shù)據(jù),而 loc[[1, 3, 8]]則是跳著查詢第 2当辐、4抖僵、9 行的數(shù)據(jù)。
- 按一列或多列篩選
按列篩選就比較簡(jiǎn)單了缘揪,不需要用到什么函數(shù)耍群,直接篩就可以,簡(jiǎn)單粗暴找筝。
比如說篩選電影數(shù)據(jù)的標(biāo)題 title 和 評(píng)分 score 中的一列或兩列:
print movie_pd['title']
print movie_pd[ ['title', 'score'] ]
- 按一行一列或多行多列同時(shí)篩選
也是借助 loc( ) 函數(shù)蹈垢,但這個(gè)時(shí)候需要通過傳入兩個(gè)參數(shù)。
print movie_pd.loc[5, 'actors']
print movie_pd.loc[[1, 5, 8], ['title', 'actors'] ]
loc[5, 'actors'] 表示篩選出索引值是 5 的行袖裕,且列名是 actors 的列曹抬。
loc[[1, 5, 8], ['title', 'actors'] ] 表示篩選出索引值是 1、5急鳄、8 的行谤民,且列名是 title 和 actors 的列堰酿。
這種篩選看起來還是挺簡(jiǎn)單的,那么問題來了张足,請(qǐng)問以下兩種寫法有什么區(qū)別触创。。为牍。
print movie_pd['title']
print movie_pd[['title']]
一會(huì)一對(duì)中括號(hào)哼绑,一會(huì)兩對(duì)中括號(hào),傻傻分不清吵聪,當(dāng)年我也是糾結(jié)了好久凌那。
其實(shí),這涉及到了 Pandas 中的另一種數(shù)據(jù)類型:Series吟逝,我們先來直觀感受一下:
print type(movie_pd['title'])
print type(movie_pd[['title']])
輸出結(jié)果如下:
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
帶有一個(gè)中括號(hào)的類型是 Series帽蝶,帶有兩個(gè)中括號(hào)的類型是 DataFrame。
之前提到過 DataFrame 類似于 Excel 中的表块攒,那么 Series 就是 Excel 表中的某一行或某一列的數(shù)據(jù)類型励稳,多個(gè)有相同索引的 Series 就可以組成一個(gè) DataFrame。
Series 類似于 Python 中的列表囱井,和 DataFrame 一樣有索引和值驹尼,基本使用如下:
temp_series = pd.Series([1, 4, 6, 10], name = 'simple_count')
print temp_series
print temp_series.index
print temp_series.values
輸出結(jié)果如下:
0 1
1 4
2 6
3 10
Name: simple_count, dtype: int64
RangeIndex(start=0, stop=4, step=1)
[ 1 4 6 10]
pd.Series ( ) 中可以傳入一個(gè)列表進(jìn)去,name 是 Series 本身的一個(gè)屬性庞呕,index 表示索引新翎,values 表示對(duì)應(yīng)的值。
所以住练,movie_pd['title'] 返回的是 name 屬性值為 title 的 Series地啰,和 DataFrame 沒有任何聯(lián)系了;而 movie_pd[['title']] 返回的是列名為 title 的 DataFrame讲逛。
當(dāng)需要單獨(dú)對(duì)某一行或某一列進(jìn)行運(yùn)算時(shí)亏吝,才會(huì)使用一對(duì)中括號(hào)的方式。
除了按行或按列篩選盏混,還可以按照一個(gè)或多個(gè)條件對(duì)數(shù)據(jù)進(jìn)行篩選:
# 篩選電影類型是劇情的 title 和 score 兩列
print movie_pd[ movie_pd['category'] == '劇情' ][['title', 'score']]
# 篩選電影排名小于等于 5 且評(píng)分高于 9.0 的 title 一列
print movie_pd[ (movie_pd['rank'] <=5) & (movie_pd['score'] > 9.0) ][['title']]
# 篩選電影發(fā)布日期大于 2010-01-01 或 評(píng)論數(shù)超過 50萬 的所有列
print movie_pd[ (movie_pd['release_date'] > '2010-01-01') | (movie_pd['vote_count'] > 500000) ]
& 表示多個(gè)條件同時(shí)滿足蔚鸥,類似于 and,| 表示多個(gè)條件滿足一個(gè)即可许赃,類似于 or止喷。
有時(shí)候還需要借助一些函數(shù)進(jìn)行篩選,比如:
isnull ( ) 函數(shù):篩選空值
notnull ( ) 函數(shù):篩選非空值
isin( ) 函數(shù):篩選某個(gè)字段的值在給定列表中
print movie_pd[ movie_pd['url'].isnull() ]
print movie_pd[ movie_pd['regions'].notnull() ]
print movie_pd[ movie_pd['score'].isin([8.0, 9.0, 9.5]) ]
講了這么多混聊,該你自己動(dòng)手實(shí)踐启盛,去篩選喜歡的電影了。
劃重點(diǎn)
- loc( ) 按照索引篩選數(shù)據(jù)
- Series DataFrame 中某一行或某一列的數(shù)據(jù)類型
- & 和 | 多條件篩選時(shí) 同時(shí)滿足 和 只滿足其一即可
- isnull( ) 空值、notnull( ) 非空值僵闯、isin( ) 值在給定列表中