美文网首页
Pandas 教程 — 电影数据是干净的吗(2)

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

作者: 数分进阶 | 来源:发表于2019-03-22 17:12 被阅读0次

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( ) : 对数值型变量划分区间

相关文章

网友评论

      本文标题:Pandas 教程 — 电影数据是干净的吗(2)

      本文链接:https://www.haomeiwen.com/subject/tcmrvqtx.html