pandas基本功能 - 汇总和计算描述统计

pandas 在数理统计上能够非常简单的获取到相关的计算值,本文中从常用的数学和统计方法,到简单的数据处理,再到层次化索引的简单介绍,

1.1 常用的数学和统计方法

方法说明
count非NA值的数量
describe方法针对Series或各DataFrame列计算总 统计
min/max计算最小值、最大值
argmin、argmax计算能够获取到最小值和最大值的索 引位置(整数)
idxmin、idxmax计算能够获取到最小值和最大值的索 引值
quantile计算样本的分位数(0到1)
sum值的总和
mean值的平均数
median值的算术中位数(50%分位数)
mad根据平均值计算平均绝对离差
var样本数值的方差
std样本值的标准差
cumsum样本值的累计和
cummin、cummax样本值的累计最小值、最大值
cumprod样本值的累计积
Pct_change计算百分数变化
import numpy as np 
import pandas as pd

arr = np.random.random((8, 3)) 
df = pd.DataFrame(arr, columns=['A','B','C'])
print(df.describe()) # 输出所有的常用数学统计量

输出

              A         B         C
count  8.000000  8.000000  8.000000
mean   0.517492  0.465855  0.729173
std    0.359797  0.330637  0.210950
min    0.021359  0.081989  0.350208
25%    0.302370  0.239486  0.598300
50%    0.550394  0.371734  0.792829
75%    0.799502  0.752754  0.864155
max    0.940869  0.993853  0.961362

1.2 相关系数与协方差

# 相关系数
print(df.corr(), end='\n\n')
# 协方差
print(df.cov())

输出

          A         B         C
A  1.000000 -0.241478 -0.696313
B -0.241478  1.000000 -0.387690
C -0.696313 -0.387690  1.000000

          A         B         C
A  0.129454 -0.028727 -0.052850
B -0.028727  0.109321 -0.027041
C -0.052850 -0.027041  0.044500

在上述的基础上我们还能够继续绘制热力图,将每个变量之间的数据关系表示的更加直接;

import seaborn as sns
import matplotlib.pyplot as plt

# 随机生成数据
arr = np.random.random((8, 3)) 
df = pd.DataFrame(arr, columns=['A','B','C'])

%matplotlib inline 
corr = df.corr() # 计算协方差
sns.heatmap(corr, 
            xticklabels = corr.columns.values,
            yticklabels = corr.columns.values) # 画热力图
plt.show() 

输出

1.2.1 指定轴计算相关值

arr = np.random.random((8, 3)) 
df = pd.DataFrame(arr, columns=['A','B','C'])
print(df,end='\n\n')
print(df.mean(axis=1),end='\n\n')  # 输出的是Series对象
print(df.mean(axis=0))# 输出的是Series对象

输出

          A         B         C
0  0.779852  0.409911  0.470607
1  0.608793  0.327177  0.177189
2  0.147843  0.380895  0.495957
3  0.782524  0.626356  0.665627
4  0.223091  0.702009  0.605694
5  0.732876  0.151342  0.647262
6  0.656550  0.145362  0.909695
7  0.873951  0.871516  0.565453

0    0.553457
1    0.371053
2    0.341565
3    0.691502
4    0.510265
5    0.510493
6    0.570535
7    0.770306
dtype: float64

A    0.600685
B    0.451821
C    0.567186
dtype: float64

1.3 唯一值、值计数以及成员资格

  • unique方法用于获取Series唯一值数组
  • value_counts方法,用于计算一个Series中各值出现的频率
  • isin方法,用于判断矢量化集合的成员资格,可用于选取Series中或者DataFrame中列中数据的子集

1.3.1 Series 对象

ser = pd.Series(['d','c','d','c','d','d','b','c','d','a',])
print(ser.unique(), end='\n\n')
print(ser.value_counts(), end='\n\n')# series 对象, 默认情况下会按值出现频率降序排列
print(ser.isin(['a', 'c']), end='\n\n') # 审查成员资格简单理解就是原数据是否在指定集合中,并返回一个只包含 True|False 的向量
print(ser[ser.isin(['a', 'c'])])

输出

['d' 'c' 'b' 'a']

d    5
c    3
a    1
b    1
dtype: int64

0    False
1     True
2    False
3     True
4    False
5    False
6    False
7     True
8    False
9     True
dtype: bool

1    c
3    c
7    c
9    a
dtype: object

1.3.2 DataFream对象

df = pd.DataFrame({
    'Tom' : [100, 96, 72, 65],
    'Merry' : [90, 89, 83, 92],
    'Jonh' : [45, 78, 92, 20]
})
print(df['Tom'].describe(), end='\n\n')
print(df['Merry'].max())

输出

count      4.00000
mean      83.25000
std       17.34695
min       65.00000
25%       70.25000
50%       84.00000
75%       97.00000
max      100.00000
Name: Tom, dtype: float64

92

对DataFrame的处理本质上还是对Series 的处理,通过对索引获取到某一列,也就是一个Series 对象之后再调用其相关方法就能够得到相关数据。

2 处理缺失数据

2.1 缺失值检测

方法说明
drop na根据标签的值中是否存在缺失数据对轴标签进行过滤(删除),可通过 阈值调节对缺失值的容忍度
fillna用指定值或插值方法(如ffill或bfill)填充缺失数据
isnul l返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值NA
notn ullIsnull的否定式
df = pd.DataFrame([[ 'Tom' ,np.nan ,456.67, 'W'],
                   [ 'Merry',34,4567.34 ,np.NaN] , 
                   [ 'John ' ,23 , np.NaN,'M'],
                   [ 'Joe',18,342.45,'F']
                  ],columns=[ 'name ' , 'age ' , ' salary' , ' gender'])
print(df, end='\n\n')
print(df.isnull(), end='\n\n')
print(df.notnull(), end='\n\n')

输出

 name   age    salary  gender
0    Tom   NaN   456.67       W
1  Merry  34.0  4567.34     NaN
2  John   23.0      NaN       M
3    Joe  18.0   342.45       F

   name    age    salary   gender
0  False   True    False    False
1  False  False    False     True
2  False  False     True    False
3  False  False    False    False

   name    age    salary   gender
0   True  False     True     True
1   True   True     True    False
2   True   True    False     True
3   True   True     True     True

2.2 过滤缺失数据

df = pd.DataFrame([
    [1., 3.4, 4],
    [np.nan, np.nan, np.nan],
    [np.nan, 6.5,7. ]
])
print(df, end='\n\n')
print(df.dropna(), end='\n\n') # 默认删除全部的异常行
print(df.dropna(how='all'), end='\n\n') # 仅删除某行内的值全部是异常的行

输出

     0    1    2
0  1.0  3.4  4.0
1  NaN  NaN  NaN
2  NaN  6.5  7.0

     0    1    2
0  1.0  3.4  4.0

     0    1    2
0  1.0  3.4  4.0
2  NaN  6.5  7.0

2.3 填充缺失数据

df = pd.DataFrame(np.random.random((4, 5)))
# 生成异常数据
df[df<0.4] = np.nan
# 将所有的异常值都填充为-1
print(df.fillna(-1))

输出

          0         1         2         3         4
0  0.531901  0.414796 -1.000000  0.813520 -1.000000
1  0.526373 -1.000000  0.578893  0.422201 -1.000000
2 -1.000000  0.669050  0.471868 -1.000000  0.684934
3  0.949863  0.608455  0.457862  0.452629  0.954808

3. 层次化索引

  • 在某个方向上拥有多个(两个及两个以上)索引级别
  • 通过层次化索引,pandas能够以低维度形式处理高维度数据
  • 通过层次化索引,可以按层级统计数据

3.1 Series

data = pd.Series(
    [988, 95743, 12324, 345, 1299],
    index = [
        ['2001', '2001', '2001', '2002', '2002', ],
        ['A', 'B','C','A','B']
    ]
)
data.index.names = ["年份", "类别"]
print(data, end='\n\n')
print(data['2001'], end='\n\n')
print(data[:,'A'], end='\n\n')

输出

年份    类别
2001  A       988
      B     95743
      C     12324
2002  A       345
      B      1299
dtype: int64

类别
A      988
B    95743
C    12324
dtype: int64

年份
2001    988
2002    345
dtype: int64

3.2 DataFrame

df = pd.DataFrame({'a':range(7),'b':range(7,0,-1),
'c':['one','one','one','two','two','two','two'],
'd':[0,1,2,0,1,2,3]})
print(df.set_index(['c', 'd']), end='\n\n')
print(df[df['c'] == 'one'], end='\n\n')

输出

       a  b
c   d      
one 0  0  7
    1  1  6
    2  2  5
two 0  3  4
    1  4  3
    2  5  2
    3  6  1

   a  b    c  d
0  0  7  one  0
1  1  6  one  1
2  2  5  one  2
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值