这篇文章主要讲解DataFrame、Series对象的apply方法。 豆瓣排名前250电影数据集下载链接: https://pan.baidu.com/s/1M5EuIQEgNfJkGPvqYczb0g 密码: mhcj
在数据集的同级目录下打开编程环境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流。
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。
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
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
对上一步的DataFrame对象的每一行做求和的聚合运算,就完成本文的最终目标:统计area字段中每个国家出现的次数。
area_count_series = area_count_df.apply(lambda x:x.sum(), axis=1)
area_count_series.head(10)
上面一段代码的运行结果如下图所示:
结果展示.png