【魏先生搞定Python系列】Pandas使用奇淫巧技(3)——汇总与计算描述统计

本文的题目完全从《利用Python进行数据分析》照搬而来。可以说汇总与计算描述统计是数据分析最基础的一个环节,包括了求和、求平均、最大值、最小值等一些列的操作。具体罗列有:

表1:汇总与计算描述统计方法
方法说明
count非NA值计数
describe针对Series或DataFrame数据做描述性统计
min/max计算最小值或最大值
argmin/argmax获取最大值或最小值的索引位置(注意是位置)
idxmin/idxmax获取最大值或最小值的索引值(注意是值,而不是位置)
quantile计算分位数
sum求和,以DataFrame类型为例,通过axis参数确定方向
mean求平均
median求算数中位数(50%分位数)
mad根据平均值计算平均绝对离差
var样本值的方差
std样本值的标准差
skew样本值的偏度(三阶矩)
kurt样本值的峰度(四阶矩)
cumsum求累计和
cummin/cummax样本值累计最大值和最小值
cumprod样本值的累计积
diff计算一阶差分
pct_change计算百分数变化

对于上述方法,有3个可选的参数,分别为:

axis制定规约轴,0为默认值,表示行相加
skipna默认为True,此时自动排除缺失值;False则不排除
level如果轴是多层索引,则该参数可以缩减分组层

在这里要特别说明下,pandas在做统计分析时,对缺失值的处理。在默认情况下,是对NA值直接忽略的,而如果将skipna参数设置为False,则只要规约的方向有NA值,则结果均为NA。如:

import pandas as pd
import numpy as np
from pandas import DataFrame

#生成一个df数据
index_list =['a','b','c','d']
column_list = ['one','two']
df1 =DataFrame([[1,np.nan],[2,-5],[6,np.nan],[np.nan,4]],index=index_list,columns=column_list)
print(df1)

s1 = df1.mean(skipna=False)
print(s1)
s2 = df1.mean()
print(s2)

s3 = df1.sum(skipna=False)
print(s3)

  还有要说明的一点,如果忽略了NA,相当于这个值不存在,如计算平均值时,分子、分母均忽略了。

  除上面的描述统计方法外,还有取唯一值、计算元素出现频次以及成员属性这几个非常实用的方法。具体方法有:

  • unique方法:计算Series值中的唯一值数组,注意返回值为np.array类型。例:
import pandas as pd
import numpy as np
from pandas import DataFrame

#生成一个df数据
column_list = ['one','two']
df =DataFrame([['a','b'],['a','c'],['d','d'],[np.nan,'c']],columns=column_list)
print(df)
print('\n')

#取出第一列和第二列计算唯一值
test1 = df['one'].unique()
test2 = df['two'].unique()
print(test1,test2)
print('\n')
#取出第一行计算唯一值
test3 = df.iloc[0,:].unique()
print(test3)

最终输出结果为:

 

从这里就可以看出来,unique方法对于na值,也算是一个值,不会缺省的。

  • value_counts方法:对一个series数据元素进行判断,返回值还是一个series,其中index是元素的唯一值,value是出现的频次。默认是按照频次从高到低排列。示例如下:
import pandas as pd
import numpy as np
from pandas import DataFrame
#生成一个测试dataframe
column_list = ['one','two']
df =DataFrame([['a','b'],['a','c'],['d','d'],[np.nan,'c']],columns=column_list)
print(df)
print('\n')

#对第一列数据进行技术统计
print(df['one'].value_counts())
#打印数据类型,返回结果为Series
print(type(df['one'].value_counts()))

运行输出结果为:

除了对Series数据直接使用外,还可以用 pd.value_counts(object)的形式加以实现。 

  • isin:判断一个Series序列中的每一个值是否在给定序列内,如果在返回True,不在返回False,最终返回一个布尔值的Series。示例如下:
import pandas as pd
import numpy as np
from pandas import DataFrame
from pandas import Series

#生成一个测试用Series
obj = Series(['a','b',1,'3','c','a','d'])
print(obj,'\n')

mask = obj.isin([1,'b'])
print(mask)

运行输出结果为:

使用isin的一大用处,就是筛选出我们想要的行, 而剔除没有用的行。这个功能不仅仅是为了筛选Series数据,否则就太局限了,这个在DataFrame里的数据也是大有作为的,如:

import pandas as pd
import numpy as np
from pandas import DataFrame
from pandas import Series

#生成一个测试用Series
df = DataFrame({'one':['a','b','c','d'],'two':[1,2,3,4]})
print(df,'\n')

#pandas很智能的可以用过mask来选取DataFrame中的数据块
mask = df['one'].isin(['a','b'])
print(df[mask],'\n')

#这是另一种表达形式,虽然表达麻烦了点,但是很直观。
print(df.loc[mask,:])

运行结果为:

 

ts//www.jianshu.com/p/42f1d2909bb6

https://blog.csdn.net/FrankieHello/article/details/97272990

 

https://www.jianshu.com/p/760b6b341c4e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值