pandas之数值计算与统计
数值计算与统计
对于DataFrame来说,求和、最大、最小、平均等统计方法,默认是按列进行统计,即axis = 0,如果添加参数axis = 1则会按照行进行统计。
如果存在空值,在统计时默认会忽略空值,如果添加参数skipna = False,统计时不会忽略空值。
- round(n) 保留n个小数
- count() 非NaN的元素个数
- sum() 和
- mean() 平均值
- median() 中位数
- max() 最大值
- min() 最小值
- mode()众数
- std() 标准差
- var() 方差
- describe():包括count()、mean()、std()、min()、25%、50%、75%、max()
- skew(),样本的偏度
- kurt(),样本的峰度
分位数
quantile(q=0.5,axis=0),统计分位数,q确定位置,默认为0.5,axix=0默认按行统计,1按列统计 【适用于Seris和DataFrame】
计算逻辑:r = i + ( j - i ) * f
①将行或者列按数值大小升序排序,并计算位置pos = 1+(n-1)*q,其中n为行或列的长度,q为定义的参数
②根据pos确定 i 和 j,例如计算得pos=3.2,则i为第3个数,j为第4个数,f为pos的小数部分
dic = {'one':[1,3,2,5,4],'two':[2,4,3,6,5],'three':[3,7,5,6,4]} df = pd.DataFrame(dic,index=list('abcde')) print(df) print(df.quantile(0.1)) print(df.quantile([0.5,0.7])) # one two three # a 1 2 3 # b 3 4 7 # c 2 3 5 # d 5 6 6 # e 4 5 4 # one 1.4 # two 2.4 # three 3.4 # Name: 0.1, dtype: float64 # one two three # 0.5 3.0 4.0 5.0 # 0.7 3.8 4.8 5.8
以上以quantile(q=0.7)为例讲解,按照列进行统计,每列的长度为5
pos = 1 + ( 5 - 1 ) * 0.7 = 3.8,因此i为每列的第3位数,j为每列的第4位数,且f为3.8的小数部分即0.8
result_one = 3 + ( 4 - 3 ) * 0.8 = 3.8
result_two = 4 + ( 5 - 4 ) * 0.8 = 4.8
reslut_three = 5+ ( 6 - 5 ) * 0.8 = 5.8
上四分位和下四分位确定位置pos = (n-1)/4和pos=3* (n-1)/4,结果计算同为r = i + ( j - i ) * f
四分位参考https://blog.csdn.net/kevinelstri/article/details/52937236
累计值
cumsum() 累计和、cumprod() 累计积、cummax()累计最大值、cummin()累计最小值【适用于Seris和DataFrame】
dic = {'one':[1,3,2,5,4],'two':[2,4,3,6,5]} df = pd.DataFrame(dic,index=list('abcde')) df['one_cumsum'] = df['one'].cumsum() #相当于增加一列 df['one_cumprod'] = df['one'].cumprod() df['two_cummax'] = df['two'].cummax() df['two_cummin'] = df['two'].cummin() print(df) # one two one_cumsum one_cumprod two_cummax two_cummin # a 1 2 1 1 2 2 # b 3 4 4 3 4 2 # c 2 3 6 6 4 2 # d 5 6 11 30 6 2 # e 4 5 15 120 6 2
唯一值
对序列进行唯一值unique()之后生成的是一维数组 【适用于Seris】
s = pd.Series(list('abaefb')) print(s) sq = s.unique() print(sq,type(sq)) sq_s = pd.Series(sq) # 0 a # 1 b # 2 a # 3 e # 4 f # 5 b # dtype: object # ['a' 'b' 'e' 'f'] <class 'numpy.ndarray'>
值计数
value_counts(),统计Seris中相同的值出现的次数,生成一个新的Seris,新Seris的index为原来的值,值为出现的次数 【适用于Seris】
参数:normalize=False, sort=True, ascending=False,bins=None, dropna=True,即默认会将结果倒序排序
s = pd.Series(list('abaefb')) s_count = s.value_counts() print(s) print(s_count,type(s_count)) # 0 a # 1 b # 2 a # 3 e # 4 f # 5 b # dtype: object # a 2 # b 2 # f 1 # e 1 # dtype: int64 <class 'pandas.core.series.Series'>
成员判断
isin([ ]),成员要使用中括号括起来,判断每个元素是否在中括号的元素中,生成的结果为布尔型的Seris或DataFrame 【适用于Seris和DataFrame】
# s = pd.Series(list('abced')) # df = pd.DataFrame(np.arange(6).reshape(2,3),columns=['a','b','c']) # print(s.isin(['a','b'])) # print(df.isin([1,2])) # 0 True # 1 True # 2 False # 3 False # 4 False # dtype: bool # a b c # 0 False True True # 1 False False False