python-数据分析-Pandas-1、Series对象
Pandas 是 Wes McKinney 在2008年开发的一个强大的分析结构化数据的工具集。Pandas 以 NumPy 为基础(实现数据存储和运算) 提供了专门用于数据分析的类型、方法和函数,对数据分析和数据挖掘提供了很好的支持; 同时 pandas 还可以跟数据可视化工具 matplotlib 很好的整合在一起,非常轻松愉快的实现数据可视化呈现。 Pandas 核心的数据类型是Series(数据系列)、DataFrame(数据窗/数据框),分别用于处理一维和二维的数据 除此之外,还有一个名为Index的类型及其子类型,它们为Series和DataFrame提供了索引功能。 日常工作中DataFrame使用得最为广泛,因为二维的数据结构刚好可以对应有行有列的表格。 Series和DataFrame都提供了大量的处理数据的方法,数据分析师以此为基础,可以实现对数据的筛选、合并、拼接、清洗、预处理、聚合、透视和可视化等各种操作
Series 对象
# -*- coding: utf-8 -*- #创建Series对象"" #Pandas 库中的Series对象可以用来表示一维数据结构,但是多了索引和一些额外的功能。 #Series类型的内部结构包含了两个数组,其中一个用来保存数据,另一个用来保存数据的索引。我们可以通过列表或数组创建Series对象 import numpy import pandas #说明:Series构造器中的data参数表示数据,index参数表示数据的索引,相当于数据对应的标签。 ser1 = pandas.Series(data=[120, 380, 250, 360], index=['一季度', '二季度', '三季度', '四季度']) print(ser1) ''' 一季度 120 二季度 380 三季度 250 四季度 360 dtype: int64 ''' print('---------------------------------------------') #通过字典创建Series对象。 #说明:通过字典创建Series对象时,字典的键就是数据的标签(索引),键对应的值就是数据。 ser2 = pandas.Series({'一季度': 320, '二季度': 380, '三季度': 250, '四季度': 360}) print(ser2) print('---------------------------------------------') #Series对象的运算 #标量运算 #我们尝试给刚才的ser1每个季度加上10,代码如下所示。 ser1 += 10 print(ser1, '\n') ''' 一季度 130 二季度 390 三季度 260 四季度 370 dtype: int64 ''' #矢量运算 #我们尝试把ser1和ser2对应季度的数据加起来,代码如下所示。 ser3 = ser1 + ser2 print(ser3, '\n') ''' 一季度 450 二季度 770 三季度 510 四季度 730 dtype: int64 ''' #索引运算 #跟数组一样,Series对象也可以进行索引和切片操作,不同的是Series对象因为内部维护了一个保存索引的数组 #所以除了可以使用整数索引检索数据外,还可以通过自己设置的索引(标签)获取对应的数据。 #使用整数索引 print(ser1[2]) #260 #使用自定义索引。 print(ser1['三季度']) #260 #赋值 ser1['一季度'] = 100 print(ser1) ''' 一季度 100 二季度 390 三季度 260 四季度 370 dtype: int64 ''' print('---------------------------------------------') #切片索引 #Series对象的切片操作跟列表、数组类似,通过给出起始和结束索引,从原来的Series对象中取出或修改部分数据 # 这里也可以使用整数索引和自定义的索引 print(ser2[1:3], '\n') #[1:3] 表示从索引为1(包含)到索引为3(不包含)的数据 ''' 二季度 380 三季度 250 dtype: int64 ''' #提示:在使用自定义索引进行切片时,结束索引对应的元素也是可以取到的。 print(ser2['二季度':'三季度'], '\n') ''' 二季度 380 三季度 250 dtype: int64 ''' #修改 ser2[1:3] = 400, 500 print(ser2, '\n') ''' 一季度 320 二季度 400 三季度 500 四季度 360 dtype: int64 ''' print('---------------------------------------------') #花式索引 #取值 print(ser2[['二季度', '四季度']], '\n') # = ser2['二季度':'四季度'] ''' 二季度 400 四季度 360 dtype: int64 ''' #修改值 ser2[['二季度', '四季度']] = 600, 520 print(ser2, '\n') ''' 一季度 320 二季度 600 三季度 500 四季度 520 dtype: int64 ''' print('---------------------------------------------') #布尔索引 print(ser2[ser2 >= 500]) ''' 二季度 600 三季度 500 四季度 520 dtype: int64 '''
Series 对象的属性和方法
Series对象的属性和方法非常多,看下面的表格,它展示了Series对象常用的属性。
属性 | 说明 |
---|---|
dtype / dtypes |
返回Series 对象的数据类型 |
hasnans |
判断Series 对象中有没有空值 |
at / iat |
通过索引访问Series 对象中的单个值 |
loc / iloc |
通过索引访问Series 对象中的单个值或一组值 |
index |
返回Series 对象的索引(Index 对象) |
is_monotonic |
判断Series 对象中的数据是否单调 |
is_monotonic_increasing |
判断Series 对象中的数据是否单调递增 |
is_monotonic_decreasing |
判断Series 对象中的数据是否单调递减 |
is_unique |
判断Series 对象中的数据是否独一无二 |
size |
返回Series 对象中元素的个数 |
values |
以ndarray 的方式返回Series 对象中的值(ndarray 对象 |
我们可以通过下面的代码来了解Series对象的属性。
#Series对象的属性和方法 print(ser2.dtype) #数据类型 print(ser2.hasnans) #判断有无空值 print(ser2.index) #索引 print(ser2.values) #值 print(ser2.is_monotonic_increasing) #判断索引是否是单调递增 print(ser2.is_unique) #判断索引是否唯一 ''' int64 False Index(['一季度', '二季度', '三季度', '四季度'], dtype='object') [320 600 500 520] False True ''' print('----------------------------------------------') #统计相关 #Series对象支持各种获取描述性统计信息的方法。 print(ser2.count()) #统计非空值的个数 print(ser2.sum()) #统计所有值的和 print(ser2.mean()) #统计所有值的平均值 print(ser2.median()) #统计所有值的中位数 print(ser2.max()) print(ser2.min()) print(ser2.std()) #统计所有值的标准差 print(ser2.var()) #统计所有值的方差 ''' 4 1940 485.0 510.0 600 320 118.18065267490557 13966.666666666666 ''' print('----------------------------------------------') #Series对象还有一个名为describe()的方法,可以获得上述所有的描述性统计信息 print(ser2.describe()) ''' count 4.000000 mean 485.000000 std 118.180653 min 320.000000 25% 455.000000 50% 510.000000 75% 540.000000 max 600.000000 dtype: float64 ''' #提示:因为describe()返回的也是一个Series对象 #所以也可以用ser2.describe()['mean']来获取平均值,用ser2.describe()[['max', 'min']]来获取最大值和最小值。 print(ser2.describe()['mean']) print('----------------------------------------------') #统计重复项 #如果Series对象有重复的值,我们可以使用unique()方法获得由独一无二的值构成的数组; # 可以使用nunique()方法统计不重复值的数量;如果想要统计每个值重复的次数,可以使用value_counts()方法,这个方法会返回一个Series对象, # 它的索引就是原来的Series对象中的值,而每个值出现的次数就是返回的Series对象中的数据,在默认情况下会按照出现次数做降序排列,如下所示 #value_counts:统计重复项 ser3 = pandas.Series(data=['apple', 'banana', 'pitaya', 'apple', 'pitaya', 'durian']) print(ser3.value_counts()) ''' apple 2 pitaya 2 banana 1 durian 1 Name: count, dtype: int64 ''' #nunique(): 统计不重复值、不重复值数量 print(ser3.nunique()) #4 #对于ser3,我们还可以用mode()方法来找出数据的众数,由于众数可能不唯一,所以mode()方法的返回值仍然是一个Series对象。 print(ser3.mode()) ''' 0 apple 1 pitaya dtype: object ''' print('----------------------------------------------') #处理数据 #Series对象的isna()和isnull()方法可以用于空值的判断,notna()和notnull()方法可以用于非空值的判断,代码如下所示。 ser4 = pandas.Series(data=[10, 20, numpy.nan, 30, numpy.nan]) print(ser4.isna()) ''' 0 False 1 False 2 True 3 False 4 True dtype: bool ''' #说明:np.nan是一个IEEE 754标准的浮点小数,专门用来表示“不是一个数” # 在上面的代码中我们用它来代表空值;当然,也可以用 Python 中的None来表示空值,在 pandas 中None也会被处理为np.nan #判断非空值 print(ser4.notna()) ''' 0 True 1 True 2 False 3 True 4 False dtype: bool ''' print('----------------------------------------------') #Series对象的dropna()和fillna()方法分别用来删除空值和填充空值,具体的用法如下所示。 #删除空值 print(ser4.dropna()) ''' 0 10.0 1 20.0 3 30.0 dtype: float64 ''' #填充空值 print(ser4.fillna(value=40)) #填充值为40 ''' 0 10.0 1 20.0 2 40.0 3 30.0 4 40.0 dtype: float64 ''' #需要提醒大家注意的是,dropna()和fillna()方法都有一个名为inplace的参数, # 它的默认值是False,表示删除空值或填充空值不会修改原来的Series对象,而是返回一个新的Series对象。 # 如果将inplace参数的值修改为True,那么删除或填充空值会就地操作,直接修改原来的Series对象,此时方法的返回值是None。 # 后面我们会接触到的很多方法,包括DataFrame对象的很多方法都会有这个参数,它们的意义跟这里是一样的。 print('----------------------------------------------') #Series对象的mask()和where()方法可以将满足或不满足条件的值进行替换,如下所示。 #和where()方法 ser5 = pandas.Series(range(5)) print(ser5.where(ser5 > 0)) print(ser5.where(ser5 > 1, 10)) #mask()方法 print(ser5.mask(ser5 > 1, 10)) print('----------------------------------------------') #Series对象的duplicated()方法可以帮助我们找出重复的数据,而drop_duplicates()方法可以帮我们删除重复数据。 # print(ser3) print(ser3.duplicated()) #找出重复数据 print(ser3.drop_duplicates()) #删除重复数据 print('----------------------------------------------') #Series对象的apply()和map()方法非常重要,它们可以通过字典或者指定的函数来处理数据,把数据映射或转换成我们想要的样子。 # 这两个方法在数据准备阶段非常重要,我们先来试一试这个名为map的方法。 ser6 = pandas.Series(['cat', 'dog', numpy.nan, 'rabbit']) # print(ser6) # map()方法 #说明:通过字典给出的映射规则对数据进行处理。 # map()方法返回一个新的Series对象,而不是修改原来的Series对象。 print(ser6.map({'cat': 'kitten', 'dog': 'puppy'})) ''' 0 I am a cat 1 I am a dog 2 NaN 3 I am a rabbit dtype: object ''' #说明:将指定字符串的format方法作用到数据系列的数据上,忽略掉所有的空值。 print(ser6.map('I am a {}'.format, na_action='ignore')) ''' 0 I am a cat 1 I am a dog 2 I am a numpy.nan 3 I am a rabbit dtype: object ''' print('----------------------------------------------') #apply() ser7 = pandas.Series([20, 21, 12], index=['London', 'New York', 'Helsinki']) # print(ser7) #说明:将求平方的函数作用到数据系列的数据上,也可以将参数np.square替换为lambda x: x ** 2。 print(ser7.apply(numpy.square)) ''' London 400 New York 441 Helsinki 144 dtype: int64 ''' #注意:apply方法中的lambda函数有两个参数,第一个参数是数据系列中的数据,而第二个参数需要我们传入, # 所以我们给apply方法增加了args参数,用于给lambda函数的第二个参数传值。 print(ser7.apply(lambda x, value: x - value, args=(5, ))) ''' London 15 New York 16 Helsinki 7 dtype: int64 ''' print('----------------------------------------------') #取头部值和排序 #Series对象的sort_index()和sort_values()方法可以用于对索引和数据的排序,排序方法有一个名为ascending的布尔类型参数, # 该参数用于控制排序的结果是升序还是降序;而名为kind的参数则用来控制排序使用的算法, # 默认使用了quicksort,也可以选择mergesort或heapsort; # 如果存在空值,那么可以用na_position参数空值放在最前还是最后,默认是last,代码如下所示 ser8 = pandas.Series( data=[35, 96, 12, 57, 25, 89], index=['grape', 'banana', 'pitaya', 'apple', 'peach', 'orange'] ) print(ser8.sort_values()) #按值从小到大排序 ''' pitaya 12 peach 25 grape 35 apple 57 orange 89 banana 96 dtype: int64 ''' print(ser8.sort_index(ascending=False)) ## 按索引从大到小排序 ascending: True 升序,False 降序 print('----------------------------------------------') #如果要从Series对象中找出元素中最大或最小的“Top-N”,我们不需要对所有的值进行排序的, # 可以使用nlargest()和nsmallest()方法来完成 print(ser8.nlargest(3)) #找出3个最大值 ''' banana 96 orange 89 apple 57 dtype: int64 ''' #找出2个最小的值 print(ser8.nsmallest(2)) ''' pitaya 12 peach 25 dtype: int64 '''
绘制图表
Series对象有一个名为plot的方法可以用来生成图表,如果选择生成折线图、饼图、柱状图等,默认会使用Series对象的索引作为横坐标,使用Series对象的数据作为纵坐标
# -*- coding: utf-8 -*- #绘制图表"" import numpy import pandas import matplotlib.pyplot as plt #创建Series对象 ser9 = pandas.Series({'Q1': 400, 'Q2': 520, 'Q3': 600, 'Q4': 800}) #通过plot方法的kind指定图表类型位柱状图 ser9.plot(kind='bar') #定制纵轴的取值范围 plt.ylim(0, 1000) #定制横轴刻度(旋转到0度) plt.xticks(rotation=0) #为柱子添加数据标签 #ser9.size获取柱子的个数 print(range(ser9.size)) #range(0, 4) for i in range(ser9.size): #获取柱子的位置和长度 #plt.text(x, y, text, ha='center') plt.text(i, ser9[i] + 5, ser9[i], ha='center') print(i, ser9[i] + 5, ser9[i]) #显示 plt.show()
绘制饼图
#绘制饼图 import numpy import pandas import matplotlib.pyplot as plt #创建Series对象 ser9 = pandas.Series({'Q1': 400, 'Q2': 520, 'Q3': 600, 'Q4': 800}) # plot方法的kind参数指定了图表类型为饼图 # autopct会自动计算并显示百分比 # pctdistance用来控制百分比到圆心的距离 ser9.plot(kind='pie', autopct='%1.1f%%', pctdistance=0.65) #显示 plt.show()
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18239810
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
python学习 / 数据分析
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步