Python数据分析-pandas进阶-2-DataFrame进阶

一、统计分析

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

你可能感兴趣的:(python,pandas,数据分析)