基于Pandas的DataFrame、Series对象的apply方法

这篇文章主要讲解DataFrame、Series对象的apply方法。 豆瓣排名前250电影数据集下载链接: https://pan.baidu.com/s/1M5EuIQEgNfJkGPvqYczb0g 密码: mhcj

1.下载数据集并读入数据

在数据集的同级目录下打开编程环境jupyter notebook 即在同级目录中打开cmd,cmd中输入命令并运行:jupyter notebook 编辑代码文件如下,然后运行:

import pandas as pd
df = pd.read_csv('豆瓣排名前250电影.csv', sep='#')

发现报错:OSError: Initializing from file failed 原因是read_csv方法不接受csv文件使用中文名。 解决方案如下:

import pandas as pd
file = open('豆瓣排名前250电影.csv')
df = pd.read_csv(file, sep='#')

这样的代码能够成功运行,所以pd.read_csv方法的第1个参数可以为字符串或者文件IO流

2.Series对象的str.split方法

area_split_series = df['area'].str.split()
area_split_series.head()

上面一段代码的运行结果如下:

0 [美国] 1 [中国大陆, 中国香港] 2 [法国] 3 [美国] 4 [意大利] Name: area, dtype: object

查看变量的数据类型,如下图所示:

查看变量数据类型.png

上图和代码结合进行理解,Series对象有str.split方法,方法中第一个参数为分隔符,默认为空格。 Series对象的str.split方法的返回值数据类型为Series,Series中的每一个值的数据类型为list。

3.Series对象的apply方法

Series对象的apply方法是Series对象进行映射。 Series对象的map方法也是Series对象进行映射。 下图对比两种方法的不同之处:

2种不同方法对比.png

作者一直以为Series对象的map和apply方法是一样的,实际上是不同的。 所以,Series对象映射为DataFrame对象的时候必须得用apply方法。

Series对象的apply方法是指对其中的每个元素进行映射。 pd.Series方法将变量area_split_series的中list元素转为Series。 Series对象的apply方法和pd.Series方法结合自动实现Series对象转换为DataFrame对象。

area_split_df = area_split_series.apply(pd.Series)
area_split_df.head()

上面一段代码的运行结果如下:

image.png

4.DataFrame对象的apply方法

DataFrame对象的apply方法有非常重要的2个参数。 第1个参数的数据类型是函数对象,是将抽出的行或者列作为Series对象,可以利用Series对象的方法做聚合运算。 第2 个参数为关键字参数axis,数据类型为整型,默认为0。当axis=0时,会将DataFrame中的每一列抽出来做聚合运算,当axis=1时,会将DataFrame中的每一行抽出来做聚合运算。 抽出来的每一行或者每一列的数据类型为Series对象,如下图所示:

image.png

聚合运算包括求最大值,最小值,求和,计数等。 进行最简单的聚合运算:计数,如下图所示:

image.png

上图表示的意思是在第1列中250个值不为空,第2列中87个值不为空,第3列中22个值不为空,第4列中9个值不为空,第5列中2个值不为空。 DataFrame对象的apply方法中的axis关键字参数默认为0。 指定axis=0,运行的效果与不指定axis的值相同,如下图所示:

image.png

指定axis=1,是对每一行做聚合运算,因为有250行,所以只能截图一部分,如下图所示:

image.png

现在要对变量area_split_df做聚合运算,对每一列的值做统计计数,代码如下:

area_count_df = area_split_df.apply(lambda x:x.value_counts())
area_count_df.head()

统计计数.png

5.得出结果

对上一步的DataFrame对象的每一行做求和的聚合运算,就完成本文的最终目标:统计area字段中每个国家出现的次数。

area_count_series = area_count_df.apply(lambda x:x.sum(), axis=1)
area_count_series.head(10)

上面一段代码的运行结果如下图所示:

结果展示.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java初学

海量数据处理

49614
来自专栏拭心的安卓进阶之路

并发编程4:Java 阻塞队列源码分析(上)

上篇文章 并发编程3:线程池的使用与执行流程 中我们了解到,线程池中需要使用阻塞队列来保存待执行的任务。这篇文章我们来详细了解下 Java 中的阻塞队列究竟是什...

4059
来自专栏Python小屋

图解Python 3.x多继承时方法解析顺序MRO

在Python 3.x的多继承树中,如果在中间层某类有向上一层解析的迹象,则会先把本层右侧的其他类方法解析完,然后从本层最后一个解析的类方法中直接进入上一层并继...

1413
来自专栏Pythonista

Python之路,Day2 - Python基础,列表,循环

1042
来自专栏数说工作室

统计师的Python日记:第四天的补充

【第4天:欢迎光临Pandas】 第四天学习了Pandas,感受了Pandas数据的DataFrame数据格式的魅力: ? 看起来就像excel一样清爽! 但...

4096
来自专栏跟着阿笨一起玩NET

深入了解VSTS的Unit Test测试属性

深入的了解一下方法上带有的属性的含义. 每个方法上几乎都带有TestMethod这个属性,我们直觉告诉我们,这肯定是表示被测试函数的意思.事实也正是如此,在Un...

681
来自专栏mathor

LeetCode410. 分割数组的最大值

 这道题看着好像没什么思路,但其实可以利用二分法来做,二分法中的mid就是最终要返回的值,也就代表着子数组的和最小的值  我们首先还是设置左右区间,左区...

1353
来自专栏小狼的世界

Pandas快速入门(一)

按照Shell中的语句,就可以进入到Ipython的环境中使用Pandas分析数据,并绘制图表。ipython 环境的具体安装配置在Mac很简单,通过pip安装...

1081
来自专栏专知

Python高效数据分析的8个技巧

【导读】不管是参加Kaggle比赛,还是开发一个深度学习应用,第一步总是数据分析,这篇文章介绍了8个使用Python进行数据分析的方法,不仅能够提升运行效率,还...

1363
来自专栏小白的技术客栈

Python基础语法-流程控制

今天讲解Python的流程控制,流程控制也比较简单,小白不想整的很复杂,以免让大家看了有一种望“文”生怯的想法。 程序控制结构 通常的程序设计语言有三种控制结构...

3076

扫码关注云+社区

领取腾讯云代金券