Pandas 教程——电影数据是干净的吗(2)

浏览: 1166

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 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 循环中依次处理完后添加到列表中,然后使用 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

当然,每次都用 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_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( ) 函数:完美解决根据变量值划分区间的问题

刚开始对电影评级的问题,现在可以这么写:

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( ) : 对数值型变量划分区间
推荐 0
本文由 数分 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册