第五章 变形

学习参考:https://github.com/datawhalechina/joyful-pandas

Ex1:美国非法药物数据集

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

dfpd.read_csv('../data/Drugs.csv').sort_values(['State','COUNTY','SubstanceName'],ignore_index=True)
df.head(3)

在这里插入图片描述

  1. 将数据转为如下的形式:
    在这里插入图片描述
  2. 将第1问中的结果恢复为原表。
  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()

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值