学习参考:https://github.com/datawhalechina/joyful-pandas
现有一份关于美国非法药物的数据集,其中SubstanceName, DrugReports分别指药物名称和报告数量:
dfpd.read_csv('../data/Drugs.csv').sort_values(['State','COUNTY','SubstanceName'],ignore_index=True)
df.head(3)
State
分别统计每年的报告数量总和,其中State, YYYY
分别为列索引和行索引,要求分别使用pivot_table
函数与groupby+unstack
两种不同的策略实现,并体会它们之间的联系。#1、转换数据框
df1 = df.pivot(index=['State','COUNTY','SubstanceName'], columns='YYYY', values='DrugReports').reset_index().rename_axis(columns={
'YYYY':''})
df1.head()
#2、将第1问中的结果恢复为原表。
df2 = df1.melt(id_vars = ['State','COUNTY','SubstanceName'],
value_vars = df1.columns[3:],var_name = 'YYYY',
value_name = 'DrugReports').dropna(subset = ['DrugReports']).astype({
'YYYY':'int64','DrugReports':'int64'})
df2 = df2.sort_values(['State','COUNTY','SubstanceName'],ignore_index=True).reindex_like(df)
df2.equals(df) # True
#3.按State分别统计每年的报告数量总和,其中State, YYYY分别为列索引和行索引,要求分别使用pivot_table函数与groupby+unstack两种不同的策略实现,并体会它们之间的联系。
#(1)使用pivot_table函数
df3 = df.pivot_table(index = 'YYYY',columns = 'State',values = 'DrugReports',aggfunc = 'sum')
df3.head()
#(2)使用groupby+unstack,这个方法没有想出来,答案的做法是:
df4 = df.groupby(['State', 'YYYY'])['DrugReports'].sum().to_frame()
df4.head()
df4 = df4.unstack(0).droplevel(0,axis=1)
df4.head()
从功能上看,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
df1 = df.rename(columns={
'Chinese':'pre_Chinese', 'Math':'pre_Math'})
df2 = pd.wide_to_long(df1,
stubnames=['pre'],
i = ['Class', 'Name'],
j = 'subject',
sep = '_',
suffix = '.+').reset_index().rename(columns={
'pre':'Grade'})
df2