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