pandas(4)统计计算
本节目标:掌握pandas作为统计工具的操作
本节内容:掌握截取和筛选,以及更进一步的统计函数,方法等
本节技术点:pandas,groupby,统计操作
本节阅读需要(20)min。
本节实操需要(20)min。
五星级推荐pandas可视化教学网站。
pandas tutor 建议使用jupter进行操作。
文章目录
- pandas(4)统计计算
- 前言
- 一、基础的统计操作
- 排序
- mean均值
- 其他
- 二、筛选filter
- 三、分组groupby
- 串联groupby
- 分组统计
- 聚类agg
- 总结
前言
pandas和numpy一样不只是提供了基础的数据结构。
pandas的数据结构见前两节。
其中讲列操作的时候提到了初步的统计操作。
我们会结合动态呈现的网站理解统计的逻辑。
一、基础的统计操作
排序
import pandas as pd
import io
csv = '''
breed,type,longevity,size
Labrador,sporting,12.04,medium
German,herding,9.73,large
Beagle,hound,12.3,small
Golden,sporting,12.04,medium
Yorkshire,toy,12.6,small
Bulldog,non-sporting,6.29,medium
Boxer,working,8.81,medium
Poodle,non-sporting,11.95,medium
'''
dogs = pd.read_csv(io.StringIO(csv)) # io.StringIO可变字符串
dogs = dogs[['breed', 'size']] # 列筛选器,产生新的df
dogs.sort_values('size', ascending=False)
这样就实现的从小到大的排序。字符串根据ascll码进行逐位排序。
但是有的时候我们如何根据字符串的长度进行排序呢?
这个业务我们也经常遇到!!!
my_index = df["Codon"].str.len().sort_values().index #索引对象
df1 = df.reindex(my_index)
我们需要先得到一个临时的统计长度的列然后排序,再得到排序的index
通过reindex重新构建一个新的排序好的df。
注意原来的df还是没有排序的。
多列排序
df_data_order1 = df.sort_values(by=['C','B'],ascending=[False,True])
一般我们总是生成某个或几个统计标准的列,然后根据这些列进行排序。
mean均值
dogs['longevity'].mean() # series
dogs[['longevity']].mean() #dataframe
dogs[['longevity']].mean(1) #按行
dogs[[‘longevity’]].mean(1)语法虽然无问题,但是均值一般是按列,对于特定的属性而言的.行均值很少见,在这里就是dogs[[‘longevity’]]没有变化。
如何按行统计均值呢?
就是dogs.mean(1)多选几个数据行才比较有意义。只选择一列统计行方向的均值是一样的。
其他
都是成员方法
print(df.count(),'→ count按列统计非Na值的数量\n')
print(df.min(),'→ min统计最小值\n',df['key2'].max(),'→ max统计最大值\n')
print(df.quantile(q=0.75),'→ quantile统计分位数,参数q确定位置\n')
print(df.sum(),'→ sum求和\n')
print(df.mean(),'→ mean求平均值\n')
print(df.median(),'→ median求算数中位数,50%分位数\n')
print(df.std(),'\n',df.var(),'→ std,var分别求标准差,方差\n')
print(df.skew(),'→ skew样本的偏度\n')
print(df.kurt(),'→ kurt样本的峰度\n')
二、筛选filter
前面讲过了用列名作为筛选器,最常用的也是列名.
但是有的时候我们可能更深入的和df中的具体的值相关.
比如说我们一个班需要得到前十名的成绩等等这样的任务.
import pandas as pd
mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},
{'a': 10, 'b': 20, 'c': 30, 'd': 40},
{'a': 100, 'b': 200, 'c': 300, 'd': 400},
{'a': 1000, 'b': 2000, 'c': 3000, 'd': 4000},
{'a': 10000, 'b': 20000, 'c': 30000, 'd': 40000},
]
df = pd.DataFrame(mydict, index=['one', 'two', 'three', 'four', 'five'])
df.loc[:, df.loc['two'] <= 20]
有点难以理解解释一下.
这里用的是loc方式进行的过滤.
loc一个参数的时候是行名df.loc[‘two’]指的是第二行,然后逐个判定第二行的值
和20的关系得到一个bool列表筛选器.
loc两个参数的时候第一个是行筛选器,其二个是列筛选器.冒号表示选中全部的行.我们发现为TRUE的是a,b两列
所以最后会选择所有的行但是只保留符合要求的列.
行的筛选用到了列的值,列的筛选用到了行的值!!!
loc以切片传入行标,以列表形式传入列标.
loc偏向于处理行。
那么如何筛选行呢?
dogs = dogs[['breed', 'size', 'longevity']]
dogs.loc[(dogs['size'] == 'medium') & (dogs['longevity'] > 12), 'breed']
注意行和列的筛选器也是不一样的。
行:形如(df[‘a’]<=10)
列:形如df.loc[‘two’] <= 20
支持逻辑操作用&和|链接。
三、分组groupby
分组,聚类,分群其实是一个概念,反映了数据内部的群聚关系。
这在现实中是很常见的。比如现在的老师总是将学生分为优等生,中等生和差生。
dogs = dogs[['breed', 'size', 'longevity']].sort_values('size')
dogs.groupby('size').mean()
groupby的参数最好是字符串,如果是数字需要注意数据的类型。
串联groupby
dogs = dogs[['breed', 'type', 'size']].sort_values('size')
dogs.groupby(['type', 'size'])
注意是顺序执行的,所以结果可能会不如预期!!!
分组统计
我们以mean均值为例。
groupby产生新的df对象,mean受到groupby的影响,会进行分组
dogs.groupby('size').mean()
过程稍微需要理解一下。
1.产生新的df,根据size分组到一起,如下。
2.根据不同的分组分别求数字数据的均值。如下:
所以过程中一共产生了两个df。
groupby其实相当于排序,会生成新的df。只不过一般针对于字符串类型的列。
聚类agg
聚类用于统计分组内的各种统计值,上面的mean就是其中一种。
但很多时候我们需要得到多种。方法如下:
(dogs
.sort_values('size')
.groupby('size')['height']
.agg(['sum', 'mean', 'std'])
)
最终结果如下:
agg必然是要在分组之后才有意义,agg的参数是具体的统计函数.
注意:
1.最终的行数等于分组的个数,名称就是用于分组的列的不同的值。
2.均值只统计其他的不是用来分组的列的平均值。且不统计字符串类型的列。
3.得到的是每个分组的统计值。
总结
知识点:
1.字符串内容的排序和长度的排序
2.groupby的串联
3.行列使用loc不同的过滤方式
行列当然是可以通过iloc纯数字过滤的,但是考虑到一般行和列都是有意义的所以loc多一点。
dataframe基础部分
下一节是关于dataframe的类数据库操作。