分析電影數(shù)據(jù)之前初茶,先來檢查一下數(shù)據(jù)的質(zhì)量卷拘,包括是否有空值喊废、重復(fù)值、異常值栗弟。
import pandas as pd
movie_pd = pd.read_csv('douban_movie.csv', header=0, sep='\t')
print movie_pd.info()
print movie_pd.describe()
movie_pd.info( ) 輸出結(jié)果如下:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3688 entries, 0 to 3687
Data columns (total 16 columns):
actor_count 3688 non-null int64
actors 3688 non-null object
category 3688 non-null object
cover_url 3688 non-null object
id 3688 non-null int64
is_playable 3688 non-null bool
is_watched 3688 non-null bool
rank 3688 non-null int64
rating 3688 non-null object
regions 3688 non-null object
release_date 3688 non-null object
score 3688 non-null float64
title 3688 non-null object
types 3688 non-null object
url 3688 non-null object
vote_count 3688 non-null int64
dtypes: bool(2), float64(1), int64(4), object(9)
可以看出,共有 3688 行電影數(shù)據(jù)工闺,所有字段均沒有空值乍赫。
movie_pd.describe ( ) 會(huì)統(tǒng)計(jì)數(shù)值型變量,輸出結(jié)果如下:
actor_count id rank score vote_count
count 3688.000000 3.688000e+03 3688.000000 3688.000000 3688.000000
mean 8.418655 3.655456e+06 124.189534 8.522587 71773.012744
std 6.067463 6.095063e+06 116.329492 0.394342 119190.948797
min 0.000000 1.291543e+06 1.000000 7.300000 305.000000
25% 4.000000 1.296384e+06 36.000000 8.300000 3513.000000
50% 7.000000 1.307067e+06 87.000000 8.500000 15786.000000
75% 12.000000 2.150085e+06 177.000000 8.800000 85188.000000
max 54.000000 2.710254e+07 534.000000 9.700000 875424.000000
actor_count 的最小值是 0陆蟆,說明有些電影在豆瓣中沒有列出演員雷厂;rank 的最小值是 1 、最大值是 534叠殷;score 的最低分是 7.3改鲫,最高分是 9.7,看起來也沒有問題林束。
再來研究一下分類型變量像棘,比如 types 字段,先挑幾個(gè)看看:
print movie_pd[['id', 'types']][1000:1006]
輸出如下:
id types
1000 1299026 [劇情, 歷史, 犯罪]
1001 1292996 [劇情, 驚悚, 犯罪]
1002 1768214 [劇情, 犯罪, 懸疑]
1003 1421742 [劇情, 懸疑, 犯罪]
1004 10455077 [劇情, 犯罪, 懸疑]
1005 1306987 [劇情, 懸疑, 驚悚, 犯罪]
幾乎每部電影都屬于多個(gè)類型壶冒,但實(shí)際上在抓取數(shù)據(jù)的時(shí)候缕题,是按照每個(gè)分類單獨(dú)抓的,所以可能存在某些優(yōu)秀的電影 (在各個(gè)分類中排名都比較靠前) 會(huì)在不同的分類中多次被抓到胖腾,我們來驗(yàn)證一下烟零。
找出 id 為 10455077 的所有電影:
print movie_pd[ movie_pd['id'] == 10455077 ][['types','category', 'rank']]
輸出的結(jié)果中有兩條紀(jì)錄:
types category rank
752 [劇情, 犯罪, 懸疑] 懸疑 128
1004 [劇情, 犯罪, 懸疑] 犯罪 214
可見,該部電影在懸疑片中排名 128咸作,在犯罪片中排名 214锨阿,但在劇情片中并未上榜。
多驗(yàn)證幾部電影后發(fā)現(xiàn)记罚,確實(shí)如此墅诡,一部電影可能被抓取多次,除了category ( 某個(gè)類別 ) 和 rank ( 在當(dāng)前類別的排名 ) 兩個(gè)字段不同之外毫胜,同一個(gè)電影的其他字段值均是相同的书斜,所以需要對數(shù)據(jù)進(jìn)行去重處理诬辈。
Pandas 中刪除數(shù)據(jù)使用 drop( ) 函數(shù)
- 按列刪除,需要設(shè)置 axis 值為 1
new_movie_pd = movie_pd.drop(['category', 'rank'], axis = 1)
刪除 movie_pd 中的 category荐吉、rank 兩列焙糟,axis = 1 表示按列刪除
- 按行刪除:一般先獲取到需要?jiǎng)h除數(shù)據(jù)的索引,然后根據(jù)索引刪除
drop_indexes = movie_pd[ movie_pd['regions'] == '[意大利]' ].index
new_movie_pd = movie_pd.drop(drop_indexes)
比如要?jiǎng)h除 regions 為 ['意大利'] 的數(shù)據(jù)样屠,先通過 index 找到索引穿撮,然后再做刪除的操作,axis =0 為默認(rèn)值痪欲,表示按行刪除悦穿,不需要賦值。
Pandas 中去重使用 drop_duplicates( ) 函數(shù)业踢,和刪除數(shù)據(jù)結(jié)合起來栗柒,最終對電影數(shù)據(jù)的去重操作如下:
new_movie_pd = movie_pd.drop(['category', 'rank'], axis = 1)
new_movie_pd = new_movie_pd.drop_duplicates()
因?yàn)槊坎侩娪暗?id 字段值是唯一的,所以可以驗(yàn)證一下去重是否成功:
print len(new_movie_pd)
print new_movie_pd['id'].nunique()
輸入結(jié)果如下:
2163
2152
nunique( ) 函數(shù)直接返回 id 去重后的個(gè)數(shù)知举,等價(jià)于 len(new_movie_pd['id'].unique( ))瞬沦,即先對id去重,然后求個(gè)數(shù)雇锡。
可見逛钻,去重后的數(shù)據(jù)存在有些電影重復(fù)出現(xiàn)的情況,否則電影的行數(shù)和 id 去重后的個(gè)數(shù)是相等的锰提。通過如下操作可以找出這些電影的 id:
movie_count = new_movie_pd.groupby('id').size().reset_index(name='count')
print movie_count[ movie_count['count'] > 1 ]
輸出結(jié)果如下:
id count
34 1291832 2
40 1291843 2
112 1292287 2
172 1292720 2
183 1292849 2
272 1293544 2
938 1306029 2
1292 1477448 2
1305 1485260 2
2124 26607693 2
2130 26683290 2
groupby 的使用之后會(huì)介紹曙痘,這里先略過,意思是通過 id 分組后計(jì)算每個(gè)電影出現(xiàn)的次數(shù)立肘,類似于 SQL 中的 這個(gè)操作:
select id, count(1) as num
from movie
group by id
having num > 1
挑一個(gè)電影 id 看看:
print new_movie_pd[ new_movie_pd['id'] == 1291832 ]
其中注意到 vote_count 字段:
vote_count
329191
329192
vote_count 評價(jià)人數(shù)不同边坤,考慮到不同分類的電影抓取是有先后順序的,某個(gè)類型既是劇情又是懸疑的電影赛不,在 劇情 分類下抓取時(shí)可能有 329191 個(gè)人評價(jià)惩嘉,而之后在 懸疑 分類下抓取的時(shí)候已經(jīng)多了個(gè)人評價(jià),變成了329192 踢故,所以去重的同時(shí)需要暫時(shí)刪除 vote_count 字段文黎。
劃重點(diǎn)
- drop( ) 按照列名 或 索引 刪除數(shù)據(jù)
- drop_duplicates( ) 刪除重復(fù)數(shù)據(jù)
- nunique( ) 返回某個(gè)字段去重后的個(gè)數(shù)
- unique( ) 對某個(gè)字段去重