joyful pandas 05 变形

练习

Ex1:美国非法药物数据集

现有一份关于美国非法药物的数据集,其中SubstanceName, DrugReports分别指药物名称和报告数量:

import pandas as pd
df = pd.read_csv('../data/drugs.csv').sort_values(['State','COUNTY','SubstanceName'],ignore_index=True)
df.head(3)
YYYY State COUNTY SubstanceName DrugReports
0 2011 KY ADAIR Buprenorphine 3
1 2012 KY ADAIR Buprenorphine 5
2 2013 KY ADAIR Buprenorphine 4
  1. 将数据转为如下的形式:

在这里插入图片描述

  1. 将第1问中的结果恢复为原表。
  2. State分别统计每年的报告数量总和,其中State, YYYY分别为列索引和行索引,要求分别使用pivot_table函数与groupby+unstack两种不同的策略实现,并体会它们之间的联系。
import pandas as pd 
import numpy as np

第一问是需要通过pivot的方式将已有表格从长表转换成宽表,代码如下,并会在后面附pivot的相关操作。
这里的思路是,根据题目给出的生成表,应该令’State’,‘COUNTY’,'SubstanceName’为转换后宽表的行索引。以DrugReports为目标值,columns为目标值的列索引,后面我通过reset_index().rename(column={“YYYY”:""}),将索引值变形,可以先看一下不加的情况,应该是这样的:
在这里插入图片描述

由于pandas内置的方法会把这些重复的内容给屏蔽掉。

res_01 = df.pivot(index=['State','COUNTY','SubstanceName'],values='DrugReports',columns=["YYYY"]).reset_index().rename(columns={
   "YYYY":""})
res_01
YYYY State COUNTY SubstanceName 2010 2011 2012 2013 2014 2015 2016 2017
0 KY ADAIR Buprenorphine NaN 3.0 5.0 4.0 27.0 5.0 7.0 10.0
1 KY ADAIR Codeine NaN NaN 1.0 NaN NaN NaN NaN 1.0
2 KY ADAIR Fentanyl NaN NaN 1.0 NaN NaN NaN NaN NaN
3 KY ADAIR Heroin NaN NaN 1.0 2.0 NaN 1.0 NaN 2.0
4 KY ADAIR Hydrocodone 6.0 9.0 10.0 10.0 9.0 7.0 11.0 3.0
... ... ... ... ... ... ... ... ... ... ... ...
6209 WV WOOD Oxycodone 6.0 4.0 24.0 7.0 7.0 11.0 7.0 1.0
6210 WV WOOD Tramadol NaN NaN NaN NaN 1.0 NaN 4.0 3.0
6211 WV WYOMING Buprenorphine NaN 1.0 1.0 1.0 NaN NaN NaN 1.0
6212 WV WYOMING Hydrocodone 1.0 5.0 NaN NaN 1.0 NaN 1.0 NaN
6213 WV WYOMING Oxycodone 5.0 4.0 14.0 12.0 5.0 NaN NaN NaN

6214 rows × 11 columns

关于pivot()方法的使用:
pivot是典型的长表变宽表的函数,而与其功能相对的则是melt函数,下面通过举个栗子来演示pivot的用法:

df_01 = pd.DataFrame({
   'Class':[1,1,2,2],
                   'Name':['San Zhang','San Zhang'
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值