Pandas 教程——電影數據是乾淨的嗎(2)
Pandas 中除了對數據進行 刪除、去重 以達到數據清洗的目的,同時為了滿足更多的計算需求,增加新列也是很常見的操作。
如果邏輯關係比較簡單,可以直接對 Pandas 的兩列進行操作得到新的一列,比如:
movie_pd[total_score] = movie_pd[vote_count] * movie_pd[score]
更一般的方法是使用 for 循環,對 Pandas 的某一列或多列進行處理後,得到新的一列。
比如需要根據電影的評分增加電影評分等級 movie_level 新列 ,評分小於 7.5 分的等級是 B,7.5 到 9.0 之間的是 A,9.0 以上的是 S,寫法如下:
import pandas as pdmovie_pd = pd.read_csv(douban_movie.csv, header=0, sep= )movie_level_list = list()for i in movie_pd.index: score = movie_pd.loc[i, score] if score < 7.5: movie_level = B elif 7.5 <= score < 9.0: movie_level = A else: movie_level = S movie_level_list.append(movie_level)movie_pd[movie_level] = pd.Series(movie_level_list)print movie_pd[[score, movie_level]].head()
建議先新建一個列表 movie_level_list,在 for 循環中依次處理完後添加到列表中,然後使用 pd.Series 的方式添加新列即可。
部分輸出如下:
score movie_level0 9.5 S1 9.3 S2 9.3 S3 8.8 A4 8.8 A
當然,每次都用 for 循環添加新列的話,難免有些繁瑣,接下來介紹 2 個非常好用的函數,讓你在 Pandas 中添加新列只需要一行代碼。
- map( ) 函數:參數中可以傳入字典,也可以使用 lambda 表達式
比如 is_playable 欄位在 Pandas 中的值是 True/False
增加一列中文的新列,True 對應的值為 可以播放,False 對應的值為 不能播放,寫法如下:
movie_pd[playable_ch] = movie_pd[is_playable].map({True: 可以播放, False: 不能播放})
直接傳入字典 {True: 可以播放, False: 不能播放} 進去即可。
又比如電影評分 9.0 以上才我想看的,增加一列 want_watch,1 表示想看,0 表示不想看
movie_pd[want_watch] = movie_pd[score].map(lambda x: 1 if x >= 9.0 else 0)
使用 lambda 表達式,其中的 x 就相當於 for 循環時每次的 score 值。
接下來看一個具體的例子,根據電影的上映日期 release_date 和 評論人數 vote_count,計算每部電影每天的平均評價人數,代碼如下:
movie_pd[release_date] = pd.to_datetime(movie_pd[release_date])movie_pd[total_day] = movie_pd[release_date].map(lambda x: (datetime.now() - x).total_seconds() / (3600 * 24))movie_pd[daily_vote] = movie_pd[vote_count] / movie_pd[total_day]print movie_pd[[release_date, total_day, vote_count, daily_vote]].head()
首先,使用 to_datetime( ) 函數將 字元串類型 轉化為日期;
然後使用 map( ) 函數計算電影上映日期距離現在的時間差,並轉化為天數;
最後,vote_count 和 total_day 兩列直接相除得到 每部電影每天的平均評價人數。
結果如下:
release_date total_day vote_count daily_vote0 1993-01-01 9081.478783 629403 69.3062241 2016-06-19 511.478783 13516 26.4253392 2017-01-22 294.478783 739 2.5095193 1997-05-30 7471.478783 240127 32.1391534 1993-08-04 8866.478783 133193 15.022085
- cut( ) 函數:完美解決根據變數值劃分區間的問題
剛開始對電影評級的問題,現在可以這麼寫:
movie_pd[movie_level] = pd.cut(movie_pd[score], bins = [0, 7.5, 9.0, float(Inf)], labels = [B, A, S], right = False)
bins 參數為一個列表,表示劃分區間的臨界值,labels 為不同區間對應的值,right = False 表示前必後開,默認為 前開後必,所以最終的區間為:[0, 7.5) 對應值為 B,[7.5,9.0) 對應值為 A,9.0 及以上對應值為 S,float(Inf) 表示正無窮大。
劃重點:
- map( ) : 參數可以傳入字典 或 使用 lambda 表達式
- to_datetime( ):將 字元串類型 轉化為 日期類型
- cut( ) : 對數值型變數劃分區間
上一節:Pandas 教程——電影數據是乾淨的嗎(1)
下一節:Pandas 教程——不同類型電影的比較(1)
推薦閱讀:
※看看黃哥是怎麼解決問題的,網友答疑對話錄
※Python進階課程筆記(三)
※在windows7中python3.4下如何升級pip?
※第三章 字典和集合
※66頁PPT堪破生活中的數據思維,讓你數據科學之路666