Pandas 中除了對數(shù)據(jù)進行 刪除膜楷、去重,以達到數(shù)據(jù)清洗的目的贞奋,同時為了滿足更多的計算需求赌厅,增加新列也是很常見的操作。
如果邏輯關(guān)系比較簡單轿塔,可以直接對 Pandas 的兩列進行操作得到新的一列特愿,比如:
movie_pd['total_score'] = movie_pd['vote_count'] * movie_pd['score']
更一般的方法是使用 for 循環(huán),對 Pandas 的某一列或多列進行處理后勾缭,得到新的一列揍障。
比如需要根據(jù)電影的評分增加電影評分等級 movie_level 新列 ,評分小于 7.5 分的等級是 B俩由,7.5 到 9.0 之間的是 A毒嫡,9.0 以上的是 S,寫法如下:
import pandas as pd
movie_pd = pd.read_csv('douban_movie.csv', header=0, sep='\t')
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 循環(huán)中依次處理完后添加到列表中兜畸,然后使用 pd.Series 的方式添加新列即可。
部分輸出如下:
score movie_level
0 9.5 S
1 9.3 S
2 9.3 S
3 8.8 A
4 8.8 A
當(dāng)然碘梢,每次都用 for 循環(huán)添加新列的話咬摇,難免有些繁瑣,接下來介紹 2 個非常好用的函數(shù)煞躬,讓你在 Pandas 中添加新列只需要一行代碼肛鹏。
- map( ) 函數(shù):參數(shù)中可以傳入字典,也可以使用 lambda 表達式
比如 is_playable 字段在 Pandas 中的值是 True/False
增加一列中文的新列恩沛,True 對應(yīng)的值為 可以播放在扰,F(xiàn)alse 對應(yīng)的值為 不能播放,寫法如下:
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 就相當(dāng)于 for 循環(huán)時每次的 score 值总放。
接下來看一個具體的例子,根據(jù)電影的上映日期 release_date 和 評論人數(shù) vote_count好爬,計算每部電影每天的平均評價人數(shù)局雄,代碼如下:
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( ) 函數(shù)將 字符串類型 轉(zhuǎn)化為日期存炮;
然后使用 map( ) 函數(shù)計算電影上映日期距離現(xiàn)在的時間差炬搭,并轉(zhuǎn)化為天數(shù);
最后穆桂,vote_count 和 total_day 兩列直接相除得到 每部電影每天的平均評價人數(shù)宫盔。
結(jié)果如下:
release_date total_day vote_count daily_vote
0 1993-01-01 9081.478783 629403 69.306224
1 2016-06-19 511.478783 13516 26.425339
2 2017-01-22 294.478783 739 2.509519
3 1997-05-30 7471.478783 240127 32.139153
4 1993-08-04 8866.478783 133193 15.022085
- cut( ) 函數(shù):完美解決根據(jù)變量值劃分區(qū)間的問題
剛開始對電影評級的問題,現(xiàn)在可以這么寫:
movie_pd['movie_level'] = pd.cut(movie_pd['score'], bins = [0, 7.5, 9.0, float('Inf')], labels = ['B', 'A', 'S'], right = False)
bins 參數(shù)為一個列表享完,表示劃分區(qū)間的臨界值灼芭,labels 為不同區(qū)間對應(yīng)的值,right = False 表示前必后開般又,默認(rèn)為 前開后必彼绷,所以最終的區(qū)間為:[0, 7.5) 對應(yīng)值為 B,[7.5,9.0) 對應(yīng)值為 A茴迁,9.0 及以上對應(yīng)值為 S寄悯,float('Inf') 表示正無窮大。
劃重點:
- map( ) : 參數(shù)可以傳入字典 或 使用 lambda 表達式
- to_datetime( ):將 字符串類型 轉(zhuǎn)化為 日期類型
- cut( ) : 對數(shù)值型變量劃分區(qū)間