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]

python占比结果添加到新数据中怎么操作 pandas计算占比_数据分析


有点难以理解解释一下.

这里用的是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']

python占比结果添加到新数据中怎么操作 pandas计算占比_字符串_02

注意行和列的筛选器也是不一样的。
行:形如(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'])

python占比结果添加到新数据中怎么操作 pandas计算占比_python_03


注意是顺序执行的,所以结果可能会不如预期!!!

分组统计

我们以mean均值为例。
groupby产生新的df对象,mean受到groupby的影响,会进行分组

dogs.groupby('size').mean()

过程稍微需要理解一下。

1.产生新的df,根据size分组到一起,如下。

python占比结果添加到新数据中怎么操作 pandas计算占比_筛选器_04

2.根据不同的分组分别求数字数据的均值。如下:

python占比结果添加到新数据中怎么操作 pandas计算占比_数据分析_05

所以过程中一共产生了两个df。

groupby其实相当于排序,会生成新的df。只不过一般针对于字符串类型的列。

聚类agg

聚类用于统计分组内的各种统计值,上面的mean就是其中一种。
但很多时候我们需要得到多种。方法如下:

(dogs
  .sort_values('size')
  .groupby('size')['height']
  .agg(['sum', 'mean', 'std'])
)

最终结果如下:

python占比结果添加到新数据中怎么操作 pandas计算占比_数据分析_06


agg必然是要在分组之后才有意义,agg的参数是具体的统计函数.

注意:

1.最终的行数等于分组的个数,名称就是用于分组的列的不同的值。
2.均值只统计其他的不是用来分组的列的平均值。且不统计字符串类型的列。
3.得到的是每个分组的统计值。


总结

知识点:
1.字符串内容的排序和长度的排序
2.groupby的串联
3.行列使用loc不同的过滤方式

行列当然是可以通过iloc纯数字过滤的,但是考虑到一般行和列都是有意义的所以loc多一点。

dataframe基础部分

下一节是关于dataframe的类数据库操作。

python占比结果添加到新数据中怎么操作 pandas计算占比_字符串_07