python高级-19.pandas - 重塑与轴向选择

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

4.2 数据规整化 - 重塑与轴向选择 多层索引的数据

# 创建
s1 = Series(
    np.random.randn(10),
    index = [
        list('aaaabbbccc'.upper()),
        [f'编号{i}' for i in range(1,11)] 
    ]
)
s1

A 编号1 -0.369503
编号2 -0.177487
编号3 -0.401961
编号4 1.315363
B 编号5 0.266647
编号6 1.309472
编号7 0.091033
C 编号8 -0.367351
编号9 -0.727623
编号10 0.252700
dtype: float64

s1.index

MultiIndex([(‘A’, ‘编号1’),
(‘A’, ‘编号2’),
(‘A’, ‘编号3’),
(‘A’, ‘编号4’),
(‘B’, ‘编号5’),
(‘B’, ‘编号6’),
(‘B’, ‘编号7’),
(‘C’, ‘编号8’),
(‘C’, ‘编号9’),
(‘C’, ‘编号10’)],
)

s3 = Series(
    np.random.randn(10),
    index = [
        ['武器']*5+['法宝']*5,
        list('aaaabbbccc'.upper()),
        [f'编号{i}' for i in range(1,11)] 
    ]
)
s3

武器 A 编号1 -0.335877
编号2 0.083602
编号3 -0.843315
编号4 0.206343
B 编号5 -0.632312
法宝 B 编号6 1.091192
编号7 0.333253
C 编号8 1.243920
编号9 -0.910045
编号10 -2.067016
dtype: float64

s2 = Series(
    np.random.randn(10),
    index = [
        list('aaaabbbccc'.upper()),
        np.arange(10)*10
    ]
)
s2

A 0 1.502101
10 1.935253
20 -0.264801
30 -0.210984
B 40 2.509966
50 -0.901753
60 0.193211
C 70 -0.205818
80 -0.194182
90 -0.265876
dtype: float64

s2.index

MultiIndex([(‘A’, 0),
(‘A’, 10),
(‘A’, 20),
(‘A’, 30),
(‘B’, 40),
(‘B’, 50),
(‘B’, 60),
(‘C’, 70),
(‘C’, 80),
(‘C’, 90)],
)

# 读取数据
s3

武器 A 编号1 -0.335877
编号2 0.083602
编号3 -0.843315
编号4 0.206343
B 编号5 -0.632312

法宝 B 编号6 1.091192
编号7 0.333253
C 编号8 1.243920
编号9 -0.910045
编号10 -2.067016
dtype: float64

s3.loc['武器','A','编号3']

-0.843314760358969

s3.iloc[9]

-2.06701572789885

dataframe 的多层索引

df1 = DataFrame(
    np.arange(24).reshape(4,6)*10,
    index = pd.Index( ['北京','北京','上海','上海'] ,name='city' ),
    columns= pd.Index([2018,2018,2019,2019,2020,2020],name='year')
    
)
df1

year 2018 2018 2019 2019 2020 2020
city
北京 0 10 20 30 40 50
北京 60 70 80 90 100 110
上海 120 130 140 150 160 170
上海 180 190 200 210 220 230

xxx.stack(level=-1, dropna=True) 将列索引转为行索引

默认丢弃nan

xxx.unstack(level=-1, fill_value=None) 将行索引转为列索引 unstack

默认将最内层的行索引转为列索引

print(s3)
s3.unstack()

武器 A 编号1 -0.335877
编号2 0.083602
编号3 -0.843315
编号4 0.206343
B 编号5 -0.632312
法宝 B 编号6 1.091192
编号7 0.333253
C 编号8 1.243920
编号9 -0.910045
编号10 -2.067016
dtype: float64
编号1 编号10 编号2 编号3 编号4 编号5 编号6 编号7 编号8 编号9
武器 A -0.335877 NaN 0.083602 -0.843315 0.206343 NaN NaN NaN NaN NaN
B NaN NaN NaN NaN NaN -0.632312 NaN NaN NaN NaN
法宝 B NaN NaN NaN NaN NaN NaN 1.091192 0.333253 NaN NaN
C NaN -2.067016 NaN NaN NaN NaN NaN NaN 1.24392 -0.910045

s3.unstack(1)

A B C
武器 编号1 -0.335877 NaN NaN
编号2 0.083602 NaN NaN
编号3 -0.843315 NaN NaN
编号4 0.206343 NaN NaN
编号5 NaN -0.632312 NaN
法宝 编号10 NaN NaN -2.067016
编号6 NaN 1.091192 NaN
编号7 NaN 0.333253 NaN
编号8 NaN NaN 1.243920
编号9 NaN NaN -0.910045

s3.unstack(1,fill_value=0)
 A   B   C

武器 编号1 -0.335877 0.000000 0.000000
编号2 0.083602 0.000000 0.000000
编号3 -0.843315 0.000000 0.000000
编号4 0.206343 0.000000 0.000000
编号5 0.000000 -0.632312 0.000000
法宝 编号10 0.000000 0.000000 -2.067016
编号6 0.000000 1.091192 0.000000
编号7 0.000000 0.333253 0.000000
编号8 0.000000 0.000000 1.243920
编号9 0.000000 0.000000 -0.910045

s3.unstack(1).unstack(0)

A B C
武器 法宝 武器 法宝 武器 法宝
编号1 -0.335877 NaN NaN NaN NaN NaN
编号10 NaN NaN NaN NaN NaN -2.067016
编号2 0.083602 NaN NaN NaN NaN NaN
编号3 -0.843315 NaN NaN NaN NaN NaN
编号4 0.206343 NaN NaN NaN NaN NaN
编号5 NaN NaN -0.632312 NaN NaN NaN
编号6 NaN NaN NaN 1.091192 NaN NaN
编号7 NaN NaN NaN 0.333253 NaN NaN
编号8 NaN NaN NaN NaN NaN 1.243920
编号9 NaN NaN NaN NaN NaN -0.910045

s3.unstack(1).unstack(0).stack().stack()

编号1 武器 A -0.335877
编号10 法宝 C -2.067016
编号2 武器 A 0.083602
编号3 武器 A -0.843315
编号4 武器 A 0.206343
编号5 武器 B -0.632312
编号6 法宝 B 1.091192
编号7 法宝 B 0.333253
编号8 法宝 C 1.243920
编号9 法宝 C -0.910045
dtype: float64

df1.unstack(-1)

year city
2018 北京 0
北京 60
上海 120
上海 180
北京 10
北京 70
上海 130
上海 190
2019 北京 20
北京 80
上海 140
上海 200
北京 30
北京 90
上海 150
上海 210
2020 北京 40
北京 100
上海 160
上海 220
北京 50
北京 110
上海 170
上海 230
dtype: int32

# 可以使用 索引的 name 进行 stack 和 unstack
df1.unstack('city')

year city
2018 北京 0
北京 60
上海 120
上海 180
北京 10
北京 70
上海 130
上海 190
2019 北京 20
北京 80
上海 140
上海 200
北京 30
北京 90
上海 150
上海 210
2020 北京 40
北京 100
上海

创建一个数据用来查看不同列为主的效果

s4 = Series(
    np.random.randn(10),
    index = [
        pd.Index(['江苏']*3+['黑龙江']*3+['浙江']*4  ,name='省份'),
        pd.Index(list('AAAAABBBBB') ,name='区域'),
        pd.Index(np.arange(1,11) , name='ID')
    ]
)
s4

省份 区域 ID
江苏 A 1 -1.005261
2 0.880256
3 -1.276275
黑龙江 A 4 0.057585
5 -0.257027
B 6 -0.343693
浙江 B 7 2.888513
8 -0.305639
9 1.278048
10 -0.481595
dtype: float64

# s4.unstack(0)
s4.unstack('省份')

省份 江苏 浙江 黑龙江
区域 ID
A 1 -1.005261 NaN NaN
2 0.880256 NaN NaN
3 -1.276275 NaN NaN
4 NaN NaN 0.057585
5 NaN NaN -0.257027
B 6 NaN NaN -0.343693
7 NaN 2.888513 NaN
8 NaN -0.305639 NaN
9 NaN 1.278048 NaN
10 NaN -0.481595 NaN

s4.unstack('省份').unstack(0)

省份 江苏 浙江 黑龙江
区域 A B A B A B
ID
1 -1.005261 NaN NaN NaN NaN NaN
2 0.880256 NaN NaN NaN NaN NaN
3 -1.276275 NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN 0.057585 NaN
5 NaN NaN NaN NaN -0.257027 NaN
6 NaN NaN NaN NaN NaN -0.343693
7 NaN NaN NaN 2.888513 NaN NaN
8 NaN NaN NaN -0.305639 NaN NaN
9 NaN NaN NaN 1.278048 NaN NaN
10 NaN NaN NaN -0.481595 NaN NaN

s4.unstack('区域')

区域 A B
省份 ID
江苏 1 -1.005261 NaN
2 0.880256 NaN
3 -1.276275 NaN
浙江 7 NaN 2.888513
8 NaN -0.305639
9 NaN 1.278048
10 NaN -0.481595
黑龙江 4 0.057585 NaN
5 -0.257027 NaN
6 NaN -0.343693

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值