1.描述性统计
min | 最小值 |
max | 最大值 |
mean | 平均值 |
median | 中位数 |
std | 标准差 |
var | 方差 |
cov | 协方差 |
sem | 标准误差 |
mode | 众数 |
skew | 偏度 |
kurt | 峰度 |
quantile | 四分位数 |
count | 非空值数目 |
mad | 平均绝对离差 |
import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(16).reshape(4,4),columns=['a','b','c','d'])
df
>
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
df.min()#每一列的最小值
>
a 0
b 1
c 2
d 3
dtype: int32
df.max()#每一列的最大值
>
a 12
b 13
c 14
d 15
dtype: int32
df.std()
>
a 5.163978
b 5.163978
c 5.163978
d 5.163978
dtype: float64
describe方法:一次性得出DataFrame主要特征的统计:
df.describe()
>
a b c d
count 4.000000 4.000000 4.000000 4.000000
mean 6.000000 7.000000 8.000000 9.000000
std 5.163978 5.163978 5.163978 5.163978
min 0.000000 1.000000 2.000000 3.000000
25% 3.000000 4.000000 5.000000 6.000000
50% 6.000000 7.000000 8.000000 9.000000
75% 9.000000 10.000000 11.000000 12.000000
max 12.000000 13.000000 14.000000 15.000000
对于category类,describe方法返回四种特征:
count | 类别计数 |
unique | 不重复类别个数 |
top | 个数最多的类别 |
freq | 个数最多的类别的数量 |
df1=pd.DataFrame({'col1':list('abbd'),'col2':list('accd')},dtype='category')
df1.describe()
>
col1 col2
count 4 4
unique 3 3
top b c
freq 2 2
info方法对数据的类型、索引、内存信息有一个直观的了解:
df.info()
>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 a 4 non-null int32
1 b 4 non-null int32
2 c 4 non-null int32
3 d 4 non-null int32
dtypes: int32(4)
memory usage: 192.0 bytes
2.移动窗口rolling方法
常用参数:
window | 接收int或offset,表示移动窗口的大小。当接受offset时,是每个窗口的时间段,索引必须为时间类型。 |
min_periods | 接收int,窗口中需要有值的观测点数量的最小值。 |
center | bool,表示窗口中间设置标签,默认为False。 |
win_type | 接收str,表示窗口类型。 |
on | 接收str,表示对DataFrame做移动窗口计算的列。 |
axis | 接收int,表示作用的轴方向,0为横轴,1为纵轴。 |
closed | 接收str,表示区间的开闭。 |
arr=np.array([[2,2,2],[4,4,4],[6,6,6],[8,8,8],[10,10,10]])
df2=pd.DataFrame(arr,columns=['one','two','three'],index=pd.data_range('2021-11-20',periods=5))
df2
>
one two three
2021-11-20 2 2 2
2021-11-21 4 4 4
2021-11-22 6 6 6
2021-11-23 8 8 8
2021-11-24 10 10 10
#rolling函数经常与描述性统计方法一起使用。
df.rolling(2).mean()#表示每一列的每两步计算一次均值。
>
one two three
2021-11-20 NaN NaN NaN
2021-11-21 3.0 3.0 3.0
2021-11-22 5.0 5.0 5.0
2021-11-23 7.0 7.0 7.0
2021-11-24 9.0 9.0 9.0
df.rolling.sum()
>
one two three
2021-11-20 NaN NaN NaN
2021-11-21 6.0 6.0 6.0
2021-11-22 10.0 10.0 10.0
2021-11-23 14.0 14.0 14.0
2021-11-24 18.0 18.0 18.0
除了接收int,其还可以接收offset对象,表示时间偏移量。且其无空值,空值会被第一个值或最后一个值替代。
df2.rolling('2D').mean()#移动窗口为2天。
>
one two three
2021-11-20 2.0 2.0 2.0
2021-11-21 3.0 3.0 3.0
2021-11-22 5.0 5.0 5.0
2021-11-23 7.0 7.0 7.0
2021-11-24 9.0 9.0 9.0
3.累计计算
cummax | 依次给出前n个数的最大值 |
cummin | |
cumprod | 依次给出前n个数的乘积 |
cumsum | 依次给出前n个数的和 |
常用参数:
axis | 0为行方向,1为列方向 |
skipna | bool,表示是否跳过nan,默认为True. |
df2.cumsum()
>
one two three
2021-11-20 2 2 2
2021-11-21 6 6 6
2021-11-22 12 12 12
2021-11-23 20 20 20
2021-11-24 30 30 30
1.分组对象GroupBy
(1)groupby方法
函数:df.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=False)
常用参数:
by | 用于确定进行分组的键值 |
axis | 操作的轴向,默认对列进行操作。 |
level | 接收int或索引名,表示标签所在级别。 |
as_index | bool,聚合后的聚合标签是否以DataFrame索引形式输出。 |
sort | bool,是否对分组根据分组标签进行排序。 |
group_keys | bool,是否显示分组标签名称。 |
squeeze | bool,是否在允许的情况下对返回的数据进行降维。 |
(2)分组聚合
GroupBy常用的描述性统计方法:
count | 数目,包括缺失值 |
median | 每组的中位数 |
head | 前n个值 |
cumcount | 对每个分组中的组员进行标记,0-n-1 |
max | |
mean | |
min | |
sum | |
size | 每组的大小 |
std |
df=pd.DataFrame({'A':['a','b','c','a','a','b','c','c','c','d'],'B':[21,12,3,2,1,4,5,1,7,54]})
df
>
A B
0 a 21
1 b 12
2 c 3
3 a 2
4 a 1
5 b 4
6 c 5
7 c 1
8 c 7
9 d 54
df.groupby('A').mean()
>
B
A
a 8
b 8
c 4
d 54
2.分组运算方法
(1)agg
agg方法接收函数并应用于每个分组:
#接收numpy函数
df.groupby('A').agg(np.mean)
>
B
A
a 8
b 8
c 4
d 54
#接收自定义函数
def f(x):
return max(x)-min(x)
df.groupby('A').agg(f)
>
B
A
a 20
b 8
c 6
d 0
#同时接收多个函数
df.groupby('A').agg([np.mean,np.std])
>
B
mean std
A
a 8 11.269428
b 8 5.656854
c 4 2.581989
d 54 NaN
#对不同列指定不同函数
df1=pd.DataFrame({'A':['a','b','c','a','a','b','c','c','c','d'],'B':[21,12,3,2,1,4,5,1,7,54],'C':[1,3,4,6,3,6,7,2,6,9]})
df1
>
A B C
0 a 21 1
1 b 12 3
2 c 3 4
3 a 2 6
4 a 1 3
5 b 4 6
6 c 5 7
7 c 1 2
8 c 7 6
9 d 54 9
df1.groupby('A').agg({'B':np.mean,'C':np.std})
>
B C
A
a 8 2.516611
b 8 2.121320
c 4 2.217356
d 54 NaN
(2)apply
该方法能够同时返回标量和数组,而agg方法仅能返回标量。
用法与agg基本相同。
1.透视表
透视表与分组聚合相似,不同的是分组聚合仅能指定一个轴作为分组键,而透视表可以指定两个轴作为分组键。
函数:pandas.pivot_table()
常用参数:
data | |
values | 字符串,用于想要聚合的数据字段名称,默认选取全部数据。 |
index | str或list,表示行分组键。 |
columns | str或list,表示列分组键。 |
aggfunc | functions,聚合函数。 |
margins | bool,表示汇总功能的开关。 |
dropna | bool,是否删掉全为nan的列。默认为False。 |
dit={'one':['a','b','b','b','a'],'two':[0,1,2,3,4],'three':[5,6,7,8,9],'four':['x','x','y','y','y]}
df=pd.DataFrame(dit)
dit
>
one two three four
0 a 0 5 x
1 b 1 6 x
2 b 2 7 y
3 b 3 8 y
4 a 4 9 y
pd.pivot_table(df,index=['one'],columns=['four'],aggfunc=np.sum)
#以one列的值作为行索引,以four列的值作为列索引对其余列分组计算和。
>
three two
four x y x y
one
a 5 9 0 4
b 6 15 1 5
2.交叉表
交叉表是一种特殊的透视表,主要用于计算分组频率。
函数:pandas.crosstab()
其参数与使用方法与透视表基本相同,唯一不同的是crosstab函数中填入的index,columns,values都是从df中取出的某一列,而不是列名。当不指定aggfunc时,其默认为统计频数。而透视表默认为mean。
pd.crosstab(index=df['one'],columns=df['four'])
>
four x y
one
a 1 1
b 1 2