目录
介绍
透视Pandas DataFrame
在Pandas DataFrame中对数据进行分组
总结
使用我们的数据集后,我们将快速查看可以使用流行的Python库从数据集轻松创建的可视化,然后逐步介绍一个可视化示例。
- 下载CSV和数据库文件-127.8 KB
- 下载源代码122.4 KB
本文是使用Python和Pandas进行数据清理系列的一部分。它旨在利用数据科学工具和技术来使开发人员快速启动并运行。
如果您想查看本系列的其他文章,可以在这里找到它们:
- 第1部分-介绍Jupyter和Pandas
- 第2部分-将CSV和SQL数据加载到Pandas中
- 第3部分-纠正Pandas中的缺失数据
- 第4部分-合并Pandas中的多个数据集
- 第5部分-清理Pandas DataFrame中的数据
- 第6部分-重塑Pandas DataFrame中的数据
- 第7部分-使用Seaborn和Pandas进行数据可视化
有时,即使清理完数据集后,有时仍然需要重塑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对于我们的可视化工作具有可用的索引。
我们采用了完整、干净的数据集,并以几种不同的方式对其进行了调整,以使我们对数据有更多的了解。
接下来,我们将看一下可视化,看看它们如何成为展示我们的数据并确保结果干净的重要工具。