Task05-变形

datawhale组队学习打卡 变形
https://datawhalechina.github.io/joyful-pandas/build/html/%E7%9B%AE%E5%BD%95/ch5.html

一、长宽表的变形

长表:

pd.DataFrame({'Gender':['F','F','M','M'],
                  'Height':[163, 160, 175, 180]})
Out: 
  Gender  Height
0      F     163
1      F     160
2      M     175
3      M     180

宽表:

 pd.DataFrame({'Height: F':[163, 160],
                'Height: M':[175, 180]})
Out: 
   Height: F  Height: M
0        163        175
1        160        180

这两张表从信息上是完全等价的,它们包含相同的身高统计数值,只是这些数值的呈现方式不同。

1.pivot函数
pivot 是一种典型的长表变宽表的函数,首先来看一个例子:下表存储了张三和李四的语文和数学分数,现在想要把语文和数学分数作为列来展示。
使用pivot之前:

df = pd.DataFrame({'Class':[1,1,2,2],
                       'Name':['San Zhang','San Zhang','Si Li','Si Li'],
                       'Subject':['Chinese','Math','Chinese','Math'],
                       'Grade':[80,75,90,85]})   
Out: 
   Class       Name  Subject  Grade
0      1  San Zhang  Chinese     80
1      1  San Zhang     Math     75
2      2      Si Li  Chinese     90
3      2      Si Li     Math     85

使用pivot之后:

df.pivot(index='Name', columns='Subject', values='Grade')
Out: 
Subject    Chinese  Math
Name                    
San Zhang       80    75
Si Li           90    85

注意:
利用 pivot 进行变形操作需要满足唯一性的要求,即由于在新表中的行列索引对应了唯一的 value ,因此原表中的 index 和 columns 对应两个列的行组合必须唯一。例如,现在把原表中第二行张三的数学改为语文就会报错,这是由于 Name 与 Subject 的组合中两次出现 (“San Zhang”, “Chinese”) ,从而最后不能够确定到底变形后应该是填写80分还是75分。

df.loc[1, 'Subject'] = 'Chinese'

try:
     df.pivot(index='Name', columns='Subject', values='Grade')
    except Exception as e:
       Err_Msg = e
Err_Msg
ValueError('Index contains duplicate entries, cannot reshape')

pandas 从 1.1.0 开始, pivot 相关的三个参数允许被设置为列表,这也意味着会返回多级索引。

df = pd.DataFrame({'Class':[1, 1, 2, 2, 1, 1, 2, 2],
                     'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li',
                               'San Zhang', 'San Zhang', 'Si Li', 'Si Li'],
                      'Examination': ['Mid', 'Final', 'Mid', 'Final',
                                     'Mid', 'Final', 'Mid', 'Final'],
                    'Subject':['Chinese', 'Chinese', 'Chinese', 'Chinese',
                                  'Math', 'Math', 'Math', 'Math'],
                      'Grade':[80, 75, 85, 65, 90, 85, 92, 88],
                      'rank':[10, 15, 21, 15, 20, 7, 6, 2]})
 df
Out: 
   Class       Name Examination  Subject  Grade  rank
0      1  San Zhang         Mid  Chinese     80    10
1      1  San Zhang       Final  Chinese     75    15
2      2      Si Li         Mid  Chinese     85    21
3      2      Si Li       Final  Chinese     65    15
4      1  San Zhang         Mid     Math     90    20
5      1  San Zhang       Final     Math     85     7
6      2      Si Li         Mid     Math     92     6
7      2      Si Li       Final     Math     88     2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值