pandas是python中的数据分析库,DataFrame、Series是pandas库中2种主要对象。
这篇文章主要讲解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
查看变量的数据类型,如下图所示:
上图和代码结合进行理解,Series对象有str.split方法,方法中第一个参数为分隔符,默认为空格。
Series对象的str.split方法的返回值数据类型为Series,Series中的每一个值的数据类型为list。
3.Series对象的apply方法
Series对象的apply方法是Series对象进行映射。
Series对象的map方法也是Series对象进行映射。
下图对比两种方法的不同之处:
作者一直以为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()
上面一段代码的运行结果如下:
4.DataFrame对象的apply方法
DataFrame对象的apply方法有非常重要的2个参数。
第1个参数的数据类型是函数对象,是将抽出的行或者列作为Series对象,可以利用Series对象的方法做聚合运算。
第2 个参数为关键字参数axis,数据类型为整型,默认为0。当axis=0时,会将DataFrame中的每一列抽出来做聚合运算,当axis=1时,会将DataFrame中的每一行抽出来做聚合运算。
抽出来的每一行或者每一列的数据类型为Series对象,如下图所示:
聚合运算包括求最大值,最小值,求和,计数等。
进行最简单的聚合运算:计数,如下图所示:
上图表示的意思是在第1列中250个值不为空,第2列中87个值不为空,第3列中22个值不为空,第4列中9个值不为空,第5列中2个值不为空。
DataFrame对象的apply方法中的axis关键字参数默认为0。
指定axis=0,运行的效果与不指定axis的值相同,如下图所示:
指定axis=1,是对每一行做聚合运算,因为有250行,所以只能截图一部分,如下图所示:
现在要对变量area_split_df做聚合运算,对每一列的值做统计计数,代码如下:
area_count_df = area_split_df.apply(lambda x:x.value_counts())
area_count_df.head()
5.得出结果
对上一步的DataFrame对象的每一行做求和的聚合运算,就完成本文的最终目标:统计area字段中每个国家出现的次数。
area_count_series = area_count_df.apply(lambda x:x.sum(), axis=1)
area_count_series.head(10)
上面一段代码的运行结果如下图所示: