文章目录
pandas层次化索引
import pandas as pd
import numpy as np
1. 创建多层行索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
- Series也可以创建多层索引
s = pd.Series(np.random.randint(0,100,4),index=[['甲','甲','乙','乙'],['黑','白','黑','白']])
s
s['甲','黑']
2 显示构造pd.MultiIndex
-
使用product
最简单,推荐使用
data = pd.DataFrame(data=np.random.randint(0,100,(4,4)),
index=pd.MultiIndex.from_product([['黑','白'],['甲','乙']]),
columns=pd.MultiIndex.from_product([['东','西'],['南','北']]))
3. 多层索引对象的索引与切片操作
DataFrame的操作
(1) 可以直接使用列名称来进行列索引
(2) 使用行索引需要用ix(),loc()等函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
分辨取出索引以后的值是dataframe还是series
data.to_csv('temp1.csv',encoding='gbk')
4. 索引的堆(stack)
stack()
把列索引转变为行索引unstack()
把行索引转变为列索引
data.stack(level=[0,1])
s
#Series转变为DataFrame 透视表
s.unstack()
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
5. 聚合操作
【注意】
-
需要指定axis
-
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。
所谓的聚合操作:平均数,标准方差,最大值,最小值……
df = pd.DataFrame(np.random.randint(10,20,(5,3)),columns=['存款','年龄','身高'])
方差: v a r = ∑ i = 1 n ( i t e m i − m e a n ) 2 n var = \frac{\sum_{i=1}^n(item_i-mean)^2}{n} var=n∑i=1n(itemi−mean)2
样本方差: s a m p l e v a r = ∑ i = 1 n ( i t e m i − m e a n ) 2 n − 1 sample_var = \frac{\sum_{i=1}^n(item_i-mean)^2}{n-1} samplevar=n−1∑i=1n(itemi−mean)2
- i t e m i item_i itemi代表列中每一个元素
- mean代表列的均值
- n代表样本的数量(行数)
- ∑ \sum ∑代表累加
- 方差中计算的波动是带有膨胀因子的
标准差: s t d = ∑ i = 1 n ( i t e m i − m e a n ) 2 n std = \sqrt{\frac{\sum_{i=1}^n(item_i-mean)^2}{n}} std=n∑i=1n(itemi−mean)2
样本标准差: s a m p l e s t d = ∑ i = 1 n ( i t e m i − m e a n ) 2 n − 1 sample_std = \sqrt{\frac{\sum_{i=1}^n(item_i-mean)^2}{n-1}} samplestd=n−1∑i=1n(itemi−mean)2
- i t e m i item_i itemi代表列中每一个元素
- mean代表列的均值
- n代表样本的数量(行数)
- ∑ \sum ∑代表累加
- 标准差在方差的基础上开根了
#方差
mean = df.mean()
((df - mean)**2).sum() / (df.shape[0]-1)
#numpy中的var是方差
np.var(df)
#pandas中的var是样本方差
df.var()
#标准差
mean = df.mean()
(((df - mean)**2).sum() / (df.shape[0]-1))**.5
#标准差
np.std(df)
#样本标准差
df.std()