您当前的位置: 首页 >  pandas

pandas(4)统计计算--超级详细

发布时间:2022-09-14 22:25:58 ,浏览量:9

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的类数据库操作。 在这里插入图片描述

关注
打赏
1688896170
查看更多评论

暂无认证

  • 9浏览

    0关注

    108697博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1783s