文章目录
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 ull | Isnull的否定式 |
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