【Pandas】四个例子掌握用Python进行数据分析!一看就懂!

前言

本文选取了四个经典案例,主要聚焦Pandas在数据分析中的简单应用,结合代码学习利用Python进行数据分析过程(●ˇ∀ˇ●)。在每个例题开始前,我们将会标注出本例题涉及的重要知识点,并在重要处添加解释和代码注释,共读者参考。

如果你遇到任何问题,欢迎在评论区一起讨论╰(*°▽°*)╯

点击最上方横幅👆下载本文例子中用到的数据包,或点此👉下载链接

敬告:数据内容仅供学习使用,不代表任何真实数据!请勿作他用!╰(‵□′)╯ 


了解Pandas

Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具。可以说Pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一。

pandas' logo

Pandas提供了两种主要的数据结构:Series和DataFrame。这些数据结构使得在Python中进行数据操作和分析变得更加方便。

1. Series: Series是Pandas中的一维标记数组。它类似于一维数组或列表,但附带了标签(label),使得数据可以按标签进行访问和操作。Series由两部分组成:数据部分和索引(index)。数据部分存储了一组值,而索引是用于标识和访问这些值的标签。

例如,创建一个Series对象来表示学生的分数:

import pandas as pd

scores = pd.Series([85, 90, 75, 80])

这将创建一个包含分数数据的Series对象。默认情况下,索引将从0开始自动分配。可以通过指定索引来自定义标签:

scores = pd.Series([85, 90, 75, 80], index=['Alice', 'Bob', 'Charlie', 'Dave'])

现在,每个分数都与对应的学生姓名相关联。

2. DataFrame: DataFrame是Pandas中最常用的数据结构,它类似于一个二维表格或电子表格。它由行和列组成,每一列可以包含不同类型的数据(如数字、字符串、布尔值等)。

可以将DataFrame视为一组Series对象的集合,它们共享相同的索引。DataFrame提供了许多功能,包括数据选择、过滤、排序、统计和数据可视化等。

创建一个简单的DataFrame示例:

data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dave'],
        'Age': [25, 30, 35, 40],
        'City': ['New York', 'London', 'Paris', 'Tokyo']}

df = pd.DataFrame(data)

将创建一个包含姓名、年龄和城市的DataFrame对象。每一列都表示一个Series对象,而DataFrame提供了将它们组合在一起的结构。

(≧∇≦)ノ学习更多关于Pandas的知识,请跳转到:Pandas教程(非常详细)-CSDN博客


1.MoviesLens 1M数据集 

GroupLens实验室提供了一些从MoviesLens用户那里收集的20世纪90年代末到21世纪初的电影评分数据的集合。浙西额数据提供了电影的评分、流派、年份和观众数据(年龄、邮编、性别、职业)。MovisLens1M数据集包含6000个用户对4000部电影的100万个评分。数据分布在三个表格之中:分别包含评分、用户信息和电影信息。


接下来我们将结合代码共同学习这一分析过程。本例题涉及以下知识点,重要处会有解释:

  1. 数据合并和连接:使用pd.merge()函数将多个DataFrame对象合并为一个新的DataFrame,根据共同的列进行连接。通过合并数据,可以将不同来源的数据整合在一起,以便进行综合分析。

  2. 数据透视表:使用pivot_table()函数创建数据透视表,基于不同的维度对数据进行汇总和聚合。

  3. 数据分组和聚合:使用groupby()函数对DataFrame对象进行分组,并应用聚合函数(如平均值、计数等)对每个组进行计算。通过分组和聚合,可以对数据进行更详细的分析和统计。

  4. 数据排序和筛选:使用sort_values()函数对DataFrame对象进行排序,根据特定的列进行升序或降序排序。同时,使用条件语句进行筛选,选择符合特定条件的行或列数据。

  5. 数据操作和转换:使用字符串处理函数(如split()explode()等)对字符串类型的列进行操作和转换,以提取有用的信息或将数据拆分成多个行。这些操作可以使数据更加便于分析和理解。

  6. 数据统计和计算:使用聚合函数(如mean()std()等)对数据进行统计和计算,揭示数据的统计特征和变化情况。


import pandas as pd
#文件皆位于根目录下
# 读取"users.dat"文件,它将列名设置为unames,并将分隔符设置为::。header=None参数表示文件中没有标题行,因此应使用unames中提供的列名。
unames = ["user_id", "gender", "age", "occupation", "zip"]
users = pd.read_table("datasets/movielens/users.dat", sep="::", header=None, names=unames, engine="python")

# 读取"ratings.dat"文件
rnames = ["user_id", "movie_id", "rating", "timestamp"]
ratings = pd.read_table("datasets/movielens/ratings.dat", sep="::", header=None, names=rnames, engine="python")

# 读取"movies.dat"文件
mnames = ["movie_id", "title", "genres"]
movies = pd.read_table("datasets/movielens/movies.dat", sep="::", header=None, names=mnames, engine="python")
#这段代码片段读取了三个文件("users.dat"、"ratings.dat"和"movies.dat"),
#并将它们分别存储在不同的pandas DataFrame中(users、ratings和movies),以便进一步分析或处理。
users.head(5)#输出用户DataFrame的前5行数据
ratings.head(5)# 输出评分DataFrame的前5行数据
movies.head(5)# 输出电影DataFrame的前5行数据
ratings# 输出完整的ratings DataFrame
user_id movie_id rating timestamp
0 1 1193 5 978300760
1 1 661 3 978302109
2 1 914 3 978301968
3 1 3408 4 978300275
4 1 2355 5 978824291
... ... ... ... ...
1000204 6040 1091 1 956716541
1000205 6040 1094 5 956704887
1000206 6040 562 5 956704746
1000207 6040 1096 4 956715648
1000208 6040 1097 4 956715569
#使用pd.merge()函数将ratings、users和movies三个DataFrame合并为一个名为data的新DataFrame。
#这个新的data DataFrame将包含了三个原始DataFrame中的所有列和行,基于它们之间的共同列进行合并。
data = pd.merge(pd.merge(ratings, users), movies)
data#输出data DataFrame合并后的所有数据
data.iloc[0]#输出data DataFrame中的第一行数据
user_id                                            1
movie_id                                        1193
rating                                             5
timestamp                                  978300760
gender                                             F
age                                                1
occupation                                        10
zip                                            48067
title         One Flew Over the Cuckoo's Nest (1975)
genres                                         Drama
Name: 0, dtype: object
#使用pivot_table()函数基于data DataFrame创建了一个名为mean_ratings的新DataFrame,
#该DataFrame计算了每个电影标题(title)在不同性别(gender)下的平均评分。
mean_ratings = data.pivot_table("rating", index="title",columns="gender", aggfunc="mean")
mean_ratings.head(5)#mean_ratings DataFrame 的前5行输出
gender F M
title
$1,000,000 Duck (1971) 3.375000 2.761905
'Night Mother (1986) 3.388889 3.352941
'Til There Was You (1997) 2.675676 2.733333
'burbs, The (1989) 2.793478 2.962085
...And Justice for All (1979) 3.828571 3.689024

Q:什么是数据透视表?

A:数据透视表是一种数据汇总和聚合的方法,通过对数据进行重新排列和汇总,可以提供对数据的多个维度的聚合结果。数据透视表可以帮助我们更好地理解数据之间的关系和趋势,从而支持更深入的数据分析和决策。数据透视表的主要优势是可以快速而灵活地汇总数据,并以一种直观的方式展示汇总结果。以下是数据透视表的几个关键要素:

1. 行索引:选择一个或多个列作为行索引,根据这些列的值进行数据的分组和分类。行索引决定了透视表中的每一行。

2. 列索引:选择一个或多个列作为列索引,根据这些列的值进行数据的分组和分类。列索引决定了透视表中的每一列。

3. 聚合值:选择一个或多个列作为聚合值,对这些列的值进行聚合计算,如求和、平均值、计数等。聚合值决定了透视表中每个单元格的内容。

4. 聚合函数:选择适当的聚合函数对聚合值进行计算。常见的聚合函数包括求和、平均值、计数、最大值、最小值等。

通过这些要素的组合,可以根据不同的需求和分析目标创建不同形式的数据透视表。数据透视表的结果可以提供对数据的多维度聚合结果,帮助我们发现数据中的模式、趋势和关联性。

#使用groupby()函数对data DataFrame按电影标题(title)进行分组,并计算每个电影标题对应的评分数量。
ratings_by_title = data.groupby("title").size()
ratings_by_title.head()#显示每个电影标题对应的评分数量。
active_titles = ratings_by_title.index[ratings_by_title >= 250]#从评分数量中筛选出了评分数大于等于250的活跃电影标题
active_titles
Index([''burbs, The (1989)', '10 Things I Hate About You (1999)',
       '101 Dalmatians (1961)', '101 Dalmatians (1996)', '12 Angry Men (1957)',
       '13th Warrior, The (1999)', '2 Days in the Valley (1996)',
       '20,000 Leagues Under the Sea (1954)', '2001: A Space Odyssey (1968)',
       '2010 (1984)',
       ...
       'X-Men (2000)', 'Year of Living Dangerously (1982)',
       'Yellow Submarine (1968)', 'You've Got Mail (1998)',
       'Young Frankenstein (1974)', 'Young Guns (1988)',
       'Young Guns II (1990)', 'Young Sherlock Holmes (1985)',
       'Zero Effect (1998)', 'eXistenZ (1999)'],
      dtype='object', name='title', length=1216)
#使用loc索引器从mean_ratings DataFrame 中选择评分数大于等于250的活跃电影标题
mean_ratings = mean_ratings.loc[active_titles]
mean_ratings
gender F M
title
'burbs, The (1989) 2.793478 2.962085
10 Things I Hate About You (1999) 3.646552 3.311966
101 Dalmatians (1961) 3.791444 3.500000
101 Dalmatians (1996) 3.240000 2.911215
12 Angry Men (1957) 4.184397 4.328421
... ... ...
Young Guns (1988) 3.371795 3.425620
Young Guns II (1990) 2.934783 2.904025
Young Sherlock Holmes (1985) 3.514706 3.363344
Zero Effect (1998) 3.864407 3.723140
eXistenZ (1999) 3.098592 3.289086
#使用rename()函数将mean_ratings DataFrame 中的索引标签从"Seven Samurai (The Magnificent Seven) (Shichinin no samurai) (1954)"更改为
#"Seven Samurai (Shichinin no samurai) (1954)"。
mean_ratings = mean_ratings.rename(index={"Seven Samurai (The Magnificent Seven) (Shichinin no samurai) (1954)":
                           "Seven Samurai (Shichinin no samurai) (1954)"})
#使用sort_values()函数根据女性观众的平均评分("F"列)对mean_ratings DataFrame 进行降序排序
top_female_ratings = mean_ratings.sort_values("F", ascending=False)
top_female_ratings.head()
gender F M diff
title
Close Shave, A (1995) 4.644444 4.473795 -0.170650
Wrong Trousers, The (1993) 4.588235 4.478261 -0.109974
Sunset Blvd. (a.k.a. Sunset Boulevard) (1950) 4.572650 4.464589 -0.108060
Wallace & Gromit: The Best of Aardman Animation (1996) 4.563107 4.385075 -0.178032
Schindler's List (1993) 4.562602 4.491415 -0.071187
#通过计算mean_ratings DataFrame 中男性观众平均评分("M"列)与女性观众平均评分("F"列)的差异,将差异值添加为名为"diff"的新列。
mean_ratings["diff"] = mean_ratings["M"] - mean_ratings["F"]
mean_ratings
gender F M diff
title
'burbs, The (1989) 2.793478 2.962085 0.168607
10 Things I Hate About You (1999) 3.646552 3.311966 -0.334586
101 Dalmatians (1961) 3.791444 3.500000 -0.291444
101 Dalmatians (1996) 3.240000 2.911215 -0.328785
12 Angry Men (1957) 4.184397 4.328421 0.144024
... ... ... ...
Young Guns (1988) 3.371795 3.425620 0.053825
Young Guns II (1990) 2.934783 2.904025 -0.030758
Young Sherlock Holmes (1985) 3.514706 3.363344 -0.151362
Zero Effect (1998) 3.864407 3.723140 -0.141266
eXistenZ (1999) 3.098592 3.289086 0.190494
#使用sort_values()函数根据差异值("diff"列)对mean_ratings DataFrame 进行升序排序
sorted_by_diff = mean_ratings.sort_values("diff")
sorted_by_diff.head()
gender F M diff
title
Dirty Dancing (1987) 3.790378 2.959596 -0.830782
Jumpin' Jack Flash (1986) 3.254717 2.578358 -0.676359
Grease (1978) 3.975265 3.367041 -0.608224
Little Women (1994) 3.870588 3.321739 -0.548849
Steel Magnolias (1989) 3.901734 3.365957 -0.535777
#通过使用切片操作[::-1]对sorted_by_diff DataFrame 进行逆序排序,并返回前5行内容。
sorted_by_diff[::-1].head(5)
gender F M diff
title
Good, The Bad and The Ugly, The (1966) 3.494949 4.221300 0.726351
Kentucky Fried Movie, The (1977) 2.878788 3.555147 0.676359
Dumb & Dumber (1994) 2.697987 3.336595 0.638608
Longest Day, The (1962) 3.411765 4.031447 0.619682
Cable Guy, The (1996) 2.250000 2.863787 0.613787
#使用groupby()函数按电影标题(titl
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值