在数据科学领域,数据清洗和重塑是至关重要的步骤。在清洗数据之后,经常需要对数据进行重塑,以便更好地理解数据或为分析做准备。本文将介绍如何使用Python和Pandas库进行数据重塑,包括pivot, pivot_table, stack, unstack和groupby方法的应用。
在Pandas中,重塑DataFrame意味着改变数据的表格结构,例如将“宽”数据表转换为“长”数据表。这类似于在Excel中使用透视表,或者在许多关系数据库中内置的pivot和crosstab功能。
例如,可以通过pivot, stack或unstack方法来改变DataFrame的结构。pivot方法用于将具有多个索引的大型数据集进行汇总,stack方法用于将具有多个索引的表格进行分组,而unstack方法则用于将具有多个唯一列的表格进行解组。
在Pandas中,可以使用pivot函数从现有的DataFrame创建一个新的DataFrame。假设表格当前以购买ID为索引,可以将之前创建的combinedData表格进行pivot操作,以获得更有趣的结构。
productsByState = combinedData.pivot(index='product_id', columns='company', values='paid')
运行此命令会生成一个重复索引错误,因为pivot仅在具有唯一键的DataFrame上工作。但是,pivot_table方法可以解决这个问题,它通过聚合重复值而不是生成错误来工作。
productsByState = combinedData.pivot_table(index=['product_id', 'product'], columns='state', values='paid')
这将产生一个DataFrame,其中列出了产品以及每个州的平均值。如果想要得到每个州所有产品销售的总和,可以改变聚合方法:
reshapedData = combinedData.pivot_table(index=['product_id', 'product'], columns='state', values='paid', aggfunc=np.sum)
reshapedData = reshapedData.fillna(0)
print(reshapedData.head(10))
现在,它产生了一个表格,列出了产品以及每个州所有产品销售的总和。第二行还去除了NaN值,并将它们替换为0,因为假设在那个州没有销售这些产品。
接下来,将探讨另一种重塑活动,即将数据元素分组在一起。让回到原始的大型DataFrame,并创建一个新的DataFrame,将单个客户的交易汇总在一起。
volumesData = combinedData.groupby(by='customer_id')
print(volumesData.head(10))
这看起来并没有做任何事情,因为DataFrame是以purchase_id为索引的。让添加一个聚合函数来汇总数据,以便分组按预期工作:
volumesData = combinedData.groupby(by='customer_id').sum()
print(volumesData.head(10))
这次分组看起来更符合预期,但似乎缺少了一些列,而且purchase_id并没有太大的意义,所以让扩展groupby方法并去掉purchase_id列:
volumesData = combinedData.groupby(by=['customer_id', 'first_name', 'last_name', 'product_id', 'product']).sum()
volumesData.drop(columns='purchase_id', inplace=True)
print(volumesData.head(10))
最终结果看起来相当不错,它为提供了客户购买的产品、数量以及他们支付的金额的一个很好的概览。
最后,将对数据集进行一次groupby更改,以创建一个按州汇总的DataFrame:
totalsData = combinedData.groupby(by='state').sum().reset_index()
totalsData.drop(columns=['purchase_id', 'customer_id', 'product_id'], inplace=True)