pandas学习笔记(第二弹)

注:本教程为系列教程此章节接前面第一弹
跳转到专题地址

本文向导

9.选取多个DataFrame

9.1 用列表选取多列

# 选取不同演员的FaceBook的粉丝数
movies[["actor_1_facebook_likes","actor_2_facebook_likes","actor_3_facebook_likes"]]

# 错误示例:
# movies["actor_1_facebook_likes","actor_2_facebook_likes","actor_3_facebook_likes"]
actor_1_facebook_likesactor_2_facebook_likesactor_3_facebook_likes
01000.0936.0855.0
140000.05000.01000.0
211000.0393.0161.0
327000.023000.023000.0
............
4912841.0593.0319.0
49130.00.00.0
4914946.0719.0489.0
491586.023.016.0

4916 rows × 3 columns

9.2 选取单列

movies[["actor_1_facebook_likes"]]
actor_1_facebook_likes
01000.0
140000.0
211000.0
327000.0
......
4912841.0
49130.0
4914946.0
491586.0

4916 rows × 1 columns

!!!注意在这里要区别下面的这种取法!!!

print(type(movies["actor_1_facebook_likes"]))
print(type(movies[["actor_1_facebook_likes"]]))
# 一种取出的是DataFrame 一种取出的是Series
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>

9.3 通过类型选择DataFrame

# 这样就会筛选出字段的类型为整形和浮点型的列(“number”表示选取所有数值列)
movies.select_dtypes(include=["int","float"])
num_critic_for_reviewsdurationdirector_facebook_likesactor_3_facebook_likes...actor_2_facebook_likesimdb_scoreaspect_ratiomovie_facebook_likes
0723.0178.00.0855.0...936.07.91.7833000
1302.0169.0563.01000.0...5000.07.12.350
2602.0148.00.0161.0...393.06.82.3585000
3813.0164.022000.023000.0...23000.08.52.35164000
..............................
491243.043.0NaN319.0...593.07.516.0032000
491313.076.00.00.0...0.06.3NaN16
491414.0100.00.0489.0...719.06.32.35660
491543.090.016.016.0...23.06.61.85456

4916 rows × 16 columns

9.4 通过过滤器选取DataFrame

9.4.1 like 过滤法

movies.filter(like="actor_1")
actor_1_facebook_likesactor_1_name
01000.0CCH Pounder
140000.0Johnny Depp
211000.0Christoph Waltz
327000.0Tom Hardy
.........
4912841.0Natalie Zea
49130.0Eva Boehnke
4914946.0Alan Ruck
491586.0John August

4916 rows × 2 columns

9.4.2 items 选取

movies.filter(items=["actor_1_name","actor_1_facebook_likes"])
actor_1_nameactor_1_facebook_likes
0CCH Pounder1000.0
1Johnny Depp40000.0
2Christoph Waltz11000.0
3Tom Hardy27000.0
.........
4912Natalie Zea841.0
4913Eva Boehnke0.0
4914Alan Ruck946.0
4915John August86.0

4916 rows × 2 columns

9.4.3 正则选取

# 选取不是以actor开头的字段
movies.filter(regex="^(?!actor)")
colordirector_namenum_critic_for_reviewsduration...title_yearimdb_scoreaspect_ratiomovie_facebook_likes
0ColorJames Cameron723.0178.0...2009.07.91.7833000
1ColorGore Verbinski302.0169.0...2007.07.12.350
2ColorSam Mendes602.0148.0...2015.06.82.3585000
3ColorChristopher Nolan813.0164.0...2012.08.52.35164000
..............................
4912ColorNaN43.043.0...NaN7.516.0032000
4913ColorBenjamin Roberds13.076.0...2013.06.3NaN16
4914ColorDaniel Hsia14.0100.0...2012.06.32.35660
4915ColorJon Gunn43.090.0...2004.06.61.85456

4916 rows × 22 columns

10.按照给定的列顺序排序

disc_core = ['movie_title','title_year', 'content_rating','genres']
disc_people = ['director_name','actor_1_name', 'actor_2_name','actor_3_name']
disc_other = ['color','country','language','plot_keywords','movie_imdb_link']
cont_fb = ['director_facebook_likes','actor_1_facebook_likes','actor_2_facebook_likes','actor_3_facebook_likes', 'cast_total_facebook_likes', 'movie_facebook_likes']
cont_finance = ['budget','gross']
cont_num_reviews = ['num_voted_users','num_user_for_reviews', 'num_critic_for_reviews']
cont_other = ['imdb_score','duration', 'aspect_ratio','facenumber_in_poster']

new_col_order = disc_core + disc_people + disc_other + cont_fb + cont_finance + cont_num_reviews + cont_other

# 我们把所有的列名按照自己的顺序进行排列,最后查看和原来的所有列是否一致
print(set(new_col_order) == set(movies.columns))

# 可以看到列显示的顺序已经按照我们的要求进行显示了
movies[new_col_order]
True
movie_titletitle_yearcontent_ratinggenres...imdb_scoredurationaspect_ratiofacenumber_in_poster
0Avatar2009.0PG-13Action|Adventure|Fantasy|Sci-Fi...7.9178.01.780.0
1Pirates of the Caribbean: At World's End2007.0PG-13Action|Adventure|Fantasy...7.1169.02.350.0
2Spectre2015.0PG-13Action|Adventure|Thriller...6.8148.02.351.0
3The Dark Knight Rises2012.0PG-13Action|Thriller...8.5164.02.350.0
..............................
4912The FollowingNaNTV-14Crime|Drama|Mystery|Thriller...7.543.016.001.0
4913A Plague So Pleasant2013.0NaNDrama|Horror|Thriller...6.376.0NaN0.0
4914Shanghai Calling2012.0PG-13Comedy|Drama|Romance...6.3100.02.355.0
4915My Date with Drew2004.0PGDocumentary...6.690.01.850.0

4916 rows × 28 columns

11 操作整个DataFrame

11.1 获取DataFrame的行和列数

movies.shape
(4916, 28)

11.2 获取DataFrame的个数

movies.size
137648

11.3 获取DataFrame的长度

len(movies)
4916

11.4 获取DataFrame的维度

movies.ndim
2

11.5 统计DataFrame中各种类型的个数

movies.count()
color                     4897
director_name             4814
num_critic_for_reviews    4867
duration                  4901
                          ... 
actor_2_facebook_likes    4903
imdb_score                4916
aspect_ratio              4590
movie_facebook_likes      4916
Length: 28, dtype: int64

11.6 取DataFrame中各列的最小值

# 都是对数值类型的列进行统计
movies.min()
num_critic_for_reviews     1.00
duration                   7.00
director_facebook_likes    0.00
actor_3_facebook_likes     0.00
                           ... 
actor_2_facebook_likes     0.00
imdb_score                 1.60
aspect_ratio               1.18
movie_facebook_likes       0.00
Length: 16, dtype: float64

11.7 取DataFrame中各列的最大值

movies.max()
num_critic_for_reviews        813.0
duration                      511.0
director_facebook_likes     23000.0
actor_3_facebook_likes      23000.0
                             ...   
actor_2_facebook_likes     137000.0
imdb_score                      9.5
aspect_ratio                   16.0
movie_facebook_likes       349000.0
Length: 16, dtype: float64

11.8 取DataFrame中各列的平均值

movies.mean()
num_critic_for_reviews      137.988905
duration                    107.090798
director_facebook_likes     691.014541
actor_3_facebook_likes      631.276313
                              ...     
actor_2_facebook_likes     1621.923516
imdb_score                    6.437429
aspect_ratio                  2.222349
movie_facebook_likes       7348.294142
Length: 16, dtype: float64

11.9 取DataFrame中各列的中位数

movies.median()
num_critic_for_reviews     108.00
duration                   103.00
director_facebook_likes     48.00
actor_3_facebook_likes     366.00
                            ...  
actor_2_facebook_likes     593.00
imdb_score                   6.60
aspect_ratio                 2.35
movie_facebook_likes       159.00
Length: 16, dtype: float64

11.10 取DataFrame中各列的分位数

movies.quantile([0.5,0.3])
num_critic_for_reviewsdurationdirector_facebook_likesactor_3_facebook_likes...actor_2_facebook_likesimdb_scoreaspect_ratiomovie_facebook_likes
0.5108.0103.048.0366.0...593.06.62.35159.0
0.360.095.011.0176.0...345.06.01.850.0

2 rows × 16 columns

11.11 取DataFrame中各列的标准差

movies.std()
num_critic_for_reviews       120.239379
duration                      25.286015
director_facebook_likes     2832.954125
actor_3_facebook_likes      1625.874802
                               ...     
actor_2_facebook_likes      4011.299523
imdb_score                     1.127802
aspect_ratio                   1.402940
movie_facebook_likes       19206.016458
Length: 16, dtype: float64

11.12 取DataFrame中各列的和

movies.sum()
num_critic_for_reviews       671592.00
duration                     524852.00
director_facebook_likes     3326544.00
actor_3_facebook_likes      3088835.00
                              ...     
actor_2_facebook_likes      7952291.00
imdb_score                    31646.40
aspect_ratio                  10200.58
movie_facebook_likes       36124214.00
Length: 16, dtype: float64

补充说明:上面的统计函数可以传入skip = bool 选择是否跳过空值

11.13 获取DataFrame中各列的统计信息

movies.describe()
num_critic_for_reviewsdurationdirector_facebook_likesactor_3_facebook_likes...actor_2_facebook_likesimdb_scoreaspect_ratiomovie_facebook_likes
count4867.0000004901.0000004814.0000004893.000000...4903.0000004916.0000004590.0000004916.000000
mean137.988905107.090798691.014541631.276313...1621.9235166.4374292.2223497348.294142
std120.23937925.2860152832.9541251625.874802...4011.2995231.1278021.40294019206.016458
min1.0000007.0000000.0000000.000000...0.0000001.6000001.1800000.000000
25%49.00000093.0000007.000000132.000000...277.0000005.8000001.8500000.000000
50%108.000000103.00000048.000000366.000000...593.0000006.6000002.350000159.000000
75%191.000000118.000000189.750000633.000000...912.0000007.2000002.3500002000.000000
max813.000000511.00000023000.00000023000.000000...137000.0000009.50000016.000000349000.000000

8 rows × 16 columns

11.14 判断DataFrame中的空值

movies.isnull()
colordirector_namenum_critic_for_reviewsduration...actor_2_facebook_likesimdb_scoreaspect_ratiomovie_facebook_likes
0FalseFalseFalseFalse...FalseFalseFalseFalse
1FalseFalseFalseFalse...FalseFalseFalseFalse
2FalseFalseFalseFalse...FalseFalseFalseFalse
3FalseFalseFalseFalse...FalseFalseFalseFalse
..............................
4912FalseTrueFalseFalse...FalseFalseFalseFalse
4913FalseFalseFalseFalse...FalseFalseTrueFalse
4914FalseFalseFalseFalse...FalseFalseFalseFalse
4915FalseFalseFalseFalse...FalseFalseFalseFalse

4916 rows × 28 columns

11.15 判断DataFrame中的非空值

movies.notnull()
colordirector_namenum_critic_for_reviewsduration...actor_2_facebook_likesimdb_scoreaspect_ratiomovie_facebook_likes
0TrueTrueTrueTrue...TrueTrueTrueTrue
1TrueTrueTrueTrue...TrueTrueTrueTrue
2TrueTrueTrueTrue...TrueTrueTrueTrue
3TrueTrueTrueTrue...TrueTrueTrueTrue
..............................
4912TrueFalseTrueTrue...TrueTrueTrueTrue
4913TrueTrueTrueTrue...TrueTrueFalseTrue
4914TrueTrueTrueTrue...TrueTrueTrueTrue
4915TrueTrueTrueTrue...TrueTrueTrueTrue

4916 rows × 28 columns

11.16 判断DataFrame中的值是否全为真

# 这样便可以查看那些是没有空值的列
movies.notnull().all()
color                     False
director_name             False
num_critic_for_reviews    False
duration                  False
                          ...  
actor_2_facebook_likes    False
imdb_score                 True
aspect_ratio              False
movie_facebook_likes       True
Length: 28, dtype: bool

11.17 在进行对有空值的列进行统计时,填充空值后才能统计

# 必须将空值进行补充后才能统计,不然返回会为空
movies[["director_name"]].fillna("").max()
director_name    Étienne Faure
dtype: object

12.DataFrame算数运算

12.1准备数据

matrix = pd.DataFrame([np.random.randint(0,10,3) for i in range(3)])
matrix
012
0205
1806
2659

12.2 加法运算

12.2.1 操作符方式

matrix + 5
012
07510
113511
2111014

12.2.2 函数方式

matrix.add(5)
012
07510
113511
2111014

12.3 减法运算

12.3.1 操作符方法

matrix - 5
012
0-3-50
13-51
2104

12.3.2 函数方法

matrix.sub(5)
012
0-3-50
13-51
2104

12.4 乘法运算

12.4.1 操作符方法

matrix * 5
012
010025
140030
2302545

12.4.2 函数方法

matrix.mul(5)
012
010025
140030
2302545

12.5 除法运算

12.5.1 操作符方法

matrix / 5
012
00.40.01.0
11.60.01.2
21.21.01.8

12.5.2 函数方法

matrix.div(5)
012
00.40.01.0
11.60.01.2
21.21.01.8

12.6 整除运算

12.6.1 操作符方法

matrix // 5
012
0001
1101
2111

12.6.2 函数方法

matrix.floordiv(5)
012
0001
1101
2111

12.7 取模运算

12.7.1 操作符方法

matrix % 5
012
0200
1301
2104

12.7.2 函数方法

matrix.mod(5)
012
0200
1301
2104

13.DataFrame比较运算

13.1 大于

13.1.1 算数方法

matrix > 5
012
0FalseFalseFalse
1TrueFalseTrue
2TrueFalseTrue

13.1.2 函数方法

matrix.gt(5)
012
0FalseFalseFalse
1TrueFalseTrue
2TrueFalseTrue

13.2 大于等于

13.2.1 算数方法

matrix >= 5
012
0FalseFalseTrue
1TrueFalseTrue
2TrueTrueTrue

13.2.2 函数方法

matrix.ge(5)
012
0FalseFalseTrue
1TrueFalseTrue
2TrueTrueTrue

13.3 小于

13.3.1 算数方法

matrix < 5
012
0TrueTrueFalse
1FalseTrueFalse
2FalseFalseFalse

13.3.2 函数方法

matrix.lt(5)
012
0TrueTrueFalse
1FalseTrueFalse
2FalseFalseFalse

13.4 小于等于

13.4.1 算数方法

matrix <= 5
012
0TrueTrueTrue
1FalseTrueFalse
2FalseTrueFalse

13.4.2 函数方法

matrix.le(5)
012
0TrueTrueTrue
1FalseTrueFalse
2FalseTrueFalse

13.5 等于

13.5.1 算数方法

matrix == 5
012
0FalseFalseTrue
1FalseFalseFalse
2FalseTrueFalse

13.5.2 函数方法

matrix.eq(5)
012
0FalseFalseTrue
1FalseFalseFalse
2FalseTrueFalse

13.6 不等于

13.6.1 算数方法

matrix != 5
012
0TrueTrueFalse
1TrueTrueTrue
2TrueFalseTrue

13.6.2 函数方法

matrix.ne(5)
012
0TrueTrueFalse
1TrueTrueTrue
2TrueFalseTrue
一、数据分析项目介绍 1. 项目所需的模块库介绍 pandas用法: 需要导入以下模块 import numpy as np import pandas as pd from pandas import Series, Dataframe 2.项目背景介绍 互联网电影资料库(Internet Movie Database,简称IMDB)是一个关于电影演员、电影、电视节目、电视明星和电影制作的在线数据库。电影作为艺术和娱乐载体已成为我们生活中的一部分,作为电影爱好者之一,希望通过分析了解电影市场大体情况,以便于以后选择电影观看。 使用的数据是IMDB美国票房排名前1000的电影数据,数据包含了电影名称,票房金额,上映年份,演职人员,IMDB评分,电影类型等信息,数据中的很多电影大家也比较熟悉。相信不少人都有这样的经历,当想要看一部电影的时候,会去百度一下谁是导演,谁是主演。如果导演是克里斯托弗•诺兰,心里已经给电影打了个8分以上的评分了。而阿汤哥的动作片,预期也都能肾上腺素飙升。对于已上映的电影,不少人会去豆瓣搜索现时的评分,或是前作的评价,若是豆瓣高分、高评论数,也会按奈不住去蹭下热度。如果要去电影院观看的话,想必不少人会更倾向选择动作片或者科幻大片这类特效丰富,影音冲击强烈的电影。近几年特效技术和3D动画的日渐成熟,影院观影已经是越来越多人的第一选择。 IMDB的资料中包括了影片的众多信息、演员、片长、内容介绍、分级、评论等。对于电影的评分目前使用最多的就是IMDB评分。 截至2018年6月21日,IMDB共收录了4,734,693部作品资料以及8,702,001名人物资料。 3.项目所需数据介绍 数据的属性包括:电影名称、评论数、评分、导演、上映时间、上映国家、主要演员、语言、IMDB评分等。 理解数据: color 、director_name 、num_critic_for_reviews、duration、director_facebook_likes 、actor_3_facebook_likes、actor_2_name 、actor_1_facebook_likes 、gross 、genres 、actor_1_name 、movie_title 、num_voted_users、cast_total_facebook_likes 、actor_3_name 、facenumber_in_poster 、plot_keywords 、movie_imdb_link 、num_user_for_reviews、language 、country、content_rating、budget、title_year 、actor_2_facebook_likes 、imdb_score 、aspect_ratio 、movie_facebook_likes 4.项目功能详细介绍 显示电影评分分布的情况; 电影数量与平均分年度变化的情况; 评论家评论数与评分的关系; 评分与电影票房的关系; 电影数量大于5前提下平均分前十的导演推荐的数据; 不同电影类型的年份累计分析; 电影时长的分布及时长是否和评分有相关性; 电影时长的分布及时长是否和评分有相关性。 二、数据分析过程 1.主要功能实现的类和方法介绍 # 清洗runtime电影时长列数据,可使用str.split()方法 df['runtime'] = df['runtime'].str.split('').str.get(0).astype(int) df['runtime'].head() # 清洗year列,使用str[:]选取年份数字并转换成int类型,使用df.unique()方法检查数据 df['year'] = df['year'].str[-5:-1].astype(int) df['year'].unique() 2. 数据分析过程代码和解释说明 导入包: 导入、查看、清洗数据: 评分分布图: 电影数量与平均分布年度变化: 评论家评论数&评分、评分&票房: 电影数量大于5平均分前十的导演: 统计不同年份、不同类型电影的数量: cumsum = df.groupby(['main_genre', 'year']).title.count() # 使用累加功能统计1980年起不同年份不同电影类型的累计数量,对于中间出现的缺失值,使用前值填充 genre_cumsum = cumsum.unstack(level=0).cumsum().ffill() # 只选取总数量大于50的电影类型数据 genre_cumsum = genre_cumsum.loc[:,genre_cumsum.iloc[-1,:] >= 50] # 根据电影类型统计数据作图 fig, ax2 = plt.subplots(figsize=(12,6)) genre_cumsum.plot(ax=ax12, legend=False, linewidth=3) # 添加数据标签 for i in last_row.iteritems(): if i[0] == 'Adventure' or i[0] == 'Biography' or i[0] == 'Horror': ax2.annotate('{} {}'.format(int(i[1]), i[0]), xy=(2018.5, i[1]-5), fontsize=12) else: ax2.annotate('{} {}'.format(int(i[1]), i[0]), xy=(2018.5, i[1]+5), fontsize=12) # 美化图表 ax2.set_title('The Aggregate Movies of Different Genres Over Years', fontsize=16) ax2.spines['top'].set_visible(False) ax2.spines['right'].set_visible(False) ax2.spines['left'].set_visible(False) ax2.tick_params(bottom=True, labelleft=False) ax2.set_xlabel('') plt.tight_layout() 电影时长的分布及时长是否和评分有相关性: fig, ax4 = plt.subplots() df['runtime_min'].hist(range=(70,210), bins=14, color=(114/255,158/255,206/255)) ax4.set_title('The Runtime Distribution of US Top Box Office Movies') ax4.spines['top'].set_visible(False) ax4.spines['left'].set_visible(False) ax4.spines['right'].set_visible(False) ax4.set_xticklabels(np.arange(70,220,10)) ax4.set_xticks(np.arange(70,220,10)) ax4.grid() 绘制时长和IMDB评分相关性: fig = plt.figure(figsize=(14,7)) sns.lmplot(data=df, x='runtime_min', y='imdb_rate') sns.despine() 三、数据分析结果评估 1、评分分布主要在5.0~8.0之间,3.0以下和9.0以上分布很少。如果8.0算为优秀,则优秀电影占比较少。 2、电影数量在1990~2000年间快速增长,2009年达到较高值。而电影的平均分整体上呈下降趋势。 3、评论家评论数与评分整体呈正相关关系,500以上评论家评论数对应的评分都高于6.0。 4、评分与票房整体呈正相关关系,但关系不强。 IMDB评分人数和电影票房的相关性很弱,高票房不代表评分人数多,低票房电影也能有大量的IMDB评分人数。 5、电影数量大于5平均分前十的导演:Christopher Nolan、Quentin Tarantino 、 Stanley Kubrick、 James Cameron 、Peter Jackson 、Alejandro G. Iñárritu 、David Fincher 、Martin Scorsese 、 Wes Anderson 、Paul Greengrass。 6. 前五大电影类型分别是动作片Action,喜剧片Comedy,动画片Animation,剧情片Drama,冒险片Adventure。1995年之前,动作片和喜剧片都是影院观众最喜爱的电影类型,对应的高票房数量不分伯仲,剧情片是另一相对流行的电影类型。1995年后,高票房的动作片快速增长,甩开了喜剧片。喜剧片随仍是高票房数量第二多的电影类型,但近几年增速明显放缓。高票房动画片进入榜单的时间最晚,但在1998年前后迎来明显增长,此后的十年里完成了对剧情片和冒险片的超越。如果动画片保持目前的增速,有望在之后的十几二十年里超越喜剧片,成为高票房数量第二的电影类型。 7. 时长和IMDB评分呈一定的相关性,时长短的电影既有高分也有低分,但时长超过160分钟的电影基本都能获得6分以上的分数,时长最长的两部电影甚至得到了接近9分的超高得分,IMDB评分接近或低于4分的电影时长均小于130分钟。丰富的剧情和长长的故事也许也是一种容易感染观众的方式,这也和之前提到的好的故事打动观众相呼应。 四、总结 数据分析的过程往往是一个从宏观到微观的过程。先从宏观上把握数据大体的情况,大胆地提出假设,然后再将数据进行细分,小心地求证。通过数据的对比,就很容易看出调整的效果。 有关活动效果的数据分析往往也会涉及数据的对比。具体的思路是从要分析的目的入手,首先思考造成这种情况的可能原因有什么,再从每个可能的原因中找到相应的数据,与要分析的目的的数据进行比较,看哪一个是造成该情况发生的主要原因。 这里要用到的是excel的图表工具,把每一种可能的数据都作出一个图表,与要分析的目的的数据图表进行比较,如果有某一个数据的变化曲线与之相差不多,则可以说这个所对应的原因是造成该情况发生的主要原因。 以上是分析活动的一些核心数据,核心数据的分析是最主要的,因为这直接反应了该活动最本质的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值