使用Python和Pandas进行数据重塑

在数据科学领域,数据清洗和重塑是至关重要的步骤。在清洗数据之后,经常需要对数据进行重塑,以便更好地理解数据或为分析做准备。本文将介绍如何使用Python和Pandas库进行数据重塑,包括pivot, pivot_table, stack, unstack和groupby方法的应用。

PandasDataFrame的重塑

在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)
    
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485