Pandas层次化索引Series/DataFrame/索引堆/聚合——笔记

pandas层次化索引

1) 隐式构造

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组

一、导入相关库

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

二、Series【Series也可以创建多层索引

① 生成基础Series

s = Series(np.random.randint(0,150,size = 10))
s

output:
0     28
1    147
2     43
3     97
4     21
5    136
6     60
7     97
8     10
9    129
dtype: int32

② 生成多层标题的Series

# 2层,第一层3,第二层2
s2 = Series(np.random.randint(0,150,size = 6),index=pd.MultiIndex.from_arrays([['A','D','B','B','C','C'],
['期中','期末','期中','期末','期中','期末']]))
s2

output:
A  期中    140
D  期末     74
B  期中     53
   期末    146
C  期中    103
   期末     39
dtype: int32

s2 = Series(np.random.randint(0,150,size = 6),
    index=pd.MultiIndex.from_tuples(
    [('A','期中'),('A','期末'),('B','期中'),('B','期末'),('C','期中'),('C','期末')]))
s2

output:
A  期中     49
   期末    100
B  期中     68
   期末    131
C  期中    103
   期末     45
dtype: int32


s3 = Series(np.random.randint(0,150,size = 6),index=pd.MultiIndex.from_product([['A','B','C'],['期中','期末']]))
s3

output:
A  期中     51
   期末      9
B  期中    145
   期末     69
C  期中     66
   期末     22
dtype: int32

 

2) 显示构造pd.MultiIndex

  • 使用数组
df = DataFrame(np.random.randint(0,150,size = (6,3)),columns=['Python','数学','En'],
    index=pd.MultiIndex.from_arrays(
    [['A','A','B','B','C','C'],['期中','期末','期中','期末','期中','期末']]))
df

 

  • 使用tuple
df = DataFrame(np.random.randint(0,150,size = (6,3)),columns=['Python','数学','En'],
    index=pd.MultiIndex.from_tuples(
    [('A','期中'),('A','期末'),('B','期中'),('B','期末'),('C','期中'),('C','期末')]))
df

 

  • 使用product【最简单,推荐使用】
df = DataFrame(np.random.randint(0,150,size = (6,3)),columns=['Python','数学','En'],
               index=pd.MultiIndex.from_product([['A','B','C'],['期中','期末']]))
df

df = DataFrame(np.random.randint(0,150,size = (36,3)),columns=['Python','数学','En'],
    index=pd.MultiIndex.from_product(
    [['A','B','C'],['期中','期末'],['上','下'],['单元一','单元二','单元三']]))
df

 

2. 多层列索引

除了行索引index,列索引columns也能用同样的方法创建多层索引

df.columns
output:
Index(['Python', '数学', 'En'], dtype='object')

df.index
output:
MultiIndex(levels=[['A', 'B', 'C'], ['期中', '期末'], ['上', '下'], 
['单元一', '单元三', '单元二']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 1, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 
1, 1, 0, 0, 0, 1, 1, 1], [0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0,
 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1]])
# 行索引和列索引一样
df = DataFrame(np.random.randint(0,150,size = (6,6)),index=list('abcdef'),
               columns=pd.MultiIndex.from_product([['Python','Math','En'],['期中','期末']]))
df

 

3. 多层索引对象的索引与切片操作

1)Series的操作

【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。

(1) 索引

s3
output:
A  期中     51
   期末      9
B  期中    145
   期末     69
C  期中     66
   期末     22
dtype: int32

s3['A','期末']
output: 9

(2) 切片

s3['A':'B']
output:
A  期中     51
   期末      9
B  期中    145
   期末     69
dtype: int32

# 切片时候,必须从最外层开始
s3['期中':'期末']
output:
Series([], dtype: int32)

s3.iloc[0:3]
output:
A  期中     51
   期末      9
B  期中    145
dtype: int32

 

2)DataFrame的操作

(1) 可以直接使用列名称来进行列索引

(2) 使用行索引需要用ix(),loc()等函数

【极其重要】推荐使用loc()函数

注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!

略【详情可查看pandas索引及切片】

 

4. 索引的堆(stack)

【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。

  • stack()
  • unstack()

 

5. 聚合操作

【注意】

  • 需要指定axis

  • 【小技巧】和unstack()相同,聚合的时候,axis等于哪一个,那一个就聚合,消失。

所谓的聚合操作:平均数,方差,最大值,最小值……

axis=0是列,axis=1是行
df2.sum(axis = 0)
output:
Python    574
数学        363
En        507
dtype: int64

df2.mean(axis = 1)
output:
小李  期中     93.000000
    期末     98.666667
大潘  期中     73.000000
    期末     80.000000
王五  期中    100.666667
    期末     36.000000
dtype: float64

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值