练习
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问中的结果恢复为原表。
- 按
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'