DataWhale & Pandas(五、变形)
学习大纲:
import numpy as np
import pandas as pd
Ex1:美国非法药物数据集
现有一份关于美国非法药物的数据集,其中
SubstanceName, DrugReports
分别指药物名称和报告数量:
df = pd.read_csv('data/drugs.csv').sort_values([
'State','COUNTY','SubstanceName'],ignore_index=True)
df.head(3)
将数据转为如下的形式:
result = df.pivot(index=['State', 'COUNTY',
'SubstanceName'], columns='YYYY',
values='DrugReports',
fill_value='-').reset_index().rename_axis(columns={'YYYY':''})
print(result)
将第1问中的结果恢复为原表。
recover = dft.melt(id_vars = ['State', 'COUNTY', 'SubstanceName'],
value_vars = dft.columns[-8:],var_name = 'YYYY',
value_name = 'DrugReports').dropna(subset = ['DrugReports'])
print(recover)
按 State
分别统计每年的报告数量总和,其中 State, YYYY
分别为列索引和行索引,要求分别使用 pivot_table
函数与 groupby+unstack
两种不同的策略实现,并体会它们之间的联系。
res = df.groupby(['State', 'YYYY'])['DrugReports'].sum().unstack(0)
print(res)
Ex2:特殊的wide_to_long方法
从功能上看,
melt
方法应当属于wide_to_long
的一种特殊情况,即stubnames
只有一类。请使用wide_to_long
生成melt
一节中的df_melted
。(提示:对列名增加适当的前缀)
df = pd.DataFrame({'Class':[1,2],
'Name':['San Zhang', 'Si Li'],
'Chinese':[80, 90],
'Math':[80, 75]})
df
Class |
Name |
Chinese |
Math |
|
0 | 1 | San Zhang |
80 | 80 |
1 | 2 | Si Li |
90 | 75 |
df = pd.DataFrame({'Class':[1,2],
'Name':['San Zhang', 'Si Li'],
'Chinese':[80, 90],'Math':[80, 75]})
df = df.rename(columns = {'Chinese':'pre_Chinese',
'Math': 'pre_Math'})
extable = pd.wide_to_long(df,
stubnames=['pre'],i = ['Class','Name'],
j='Subject',sep='_',
suffix='.+').reset_index().rename(columns={'pre':'Grade'})
print(extable)