在Pandas DataFrame中重塑数据

目录

介绍

透视Pandas DataFrame

在Pandas DataFrame中对数据进行分组

总结


使用我们的数据集后,我们将快速查看可以使用流行的Python库从数据集轻松创建的可视化,然后逐步介绍一个可视化示例。

介绍

本文是使用PythonPandas进行数据清理系列的一部分。它旨在利用数据科学工具和技术来使开发人员快速启动并运行。

如果您想查看本系列的其他文章,可以在这里找到它们:

有时,即使清理完数据集后,有时仍然需要重塑Pandas DataFrame以充分利用数据。重塑是操纵表结构以形成不同的数据集时使用的术语,例如将数据表设置为

如果您使用过Excel中的数据透视表或许多关系数据库中内置的数据透视交叉表支持,那么您会感到熟悉这一点。

例如,上面的表格(来自Pandas文档)已通过透视、堆叠或拆开表格进行了调整。

  • pivot方法采用具有多个索引的大型数据集并将其汇总
  • stack方法采用具有多个索引的表并将其分组
  • unstack方法采用具有多个唯一列的表并将其取消分组

在此阶段,我们将研究多种方法来使用Pandas重塑数据。我们将看到如何使用数据帧的透视和堆栈来获取数据的不同图片。

请注意,我们已经使用该系列模块的源数据文件创建了完整的Jupyter Notebook,您可以在本文头部下载和安装

透视Pandas DataFrame

借助Pandas,我们可以使用pivot函数从现有的框架创建一个新的DataFrame。目前,我们的表已按购买ID创建索引,但让我们将之前创建的combinedData表转换为更有趣的表。

首先,让我们尝试以下pivot方法,方法是启动一个新的代码块并添加:

productsByState = combinedData.pivot(index='product_id', columns='company', values='paid')

结果看起来像这样:

运行此命令会产生重复的索引错误,pivot仅适用于具有唯一键的DataFrame

但是还有另一种方法可以使我们得到解决这个问题的方法。pivot_table的工作原理与数据透视类似,但它会汇总重复的值而不产生错误。

  • 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,因为假定该产品在该状态下没有销售。

Pandas DataFrame中对数据进行分组

我们将看到的另一种重塑活动是将数据元素分组在一起。让我们回到原始的大型DataFrame并创建一个将单个客户的交易分组在一起的新DataFrame

  • groupby方法采用大型数据集并按列值分组

启动一个新的代码块并添加:

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)

这里的关键变化是我们在reset_index方法之后添加了一个sum方法。这是为了确保生成的DataFrame对于我们的可视化工作具有可用的索引。

总结

我们采用了完整、干净的数据集,并以几种不同的方式对其进行了调整,以使我们对数据有更多的了解。

接下来,我们将看一下可视化,看看它们如何成为展示我们的数据并确保结果干净的重要工具。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值