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=ni=1n(itemimean)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=n1i=1n(itemimean)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=ni=1n(itemimean)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=n1i=1n(itemimean)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()