一个简单的例子来看 Python 和 Excel 的区别

假设您是一家公司的分析师,并且非常精通Excel。您知道如何编写公式,制作数据透视表等方法来处理数据并进行精彩的展示。假如有一天,您要处理公司的销售额数据(数据非常大),看起来像这样。你该怎么办呢?

数据集大约为10000行,包括您公司一段时间内的所有销售数据。 营销部门有兴趣了解客户购买模式。 您需要探索以下问题:

  • 有多少顾客购买了鞋子(shoes)?
  • 有多少客户购买了皮带(belts)?
  • 哪些购买了鞋子但没有购买皮带?
  • 哪些客户购买了鞋子,又购买了皮带和衬衫(shirts)?

通常,您将开始在Excel中对数据进行排序和管理。使用Excel的数据过滤器当然很简单,但是当您想要获得唯一的客户列表时,它们开始变得更具挑战性。由于客户在一段时间内进行多次购买,因此您必须对数据进行排序、pivot 并执行额外的过滤步骤,然后生成报告。但是下次遇到同样的需求呢?难道继续重复上述步骤吗?

来看看怎么用Python来解决这个问题(本篇文章代码适用于 Python 3.X)

首先来看一个简单的韦恩图,会让我们的思路更清晰明了,我们要找的其实是各种交集中的客户。

由于文件是 csv 格式,所以我们要用到 csv 模块,然后用把买过鞋子、皮带、衬衫的客户添加到各自的集合(set)中。

  • 首先加载 csv 模块
import csv
  • 读取源文件
with open("sample-sales.csv",'rt') as f:
    reader = csv.reader(f)
  • 将集初始化为空值
shoes = set()
belts = set()
shirts = set()
  • 读取文件的每一行,获取客户信息并添加到相应的集合中。客户只要买过该产品就会添加到对应的集中,比如客户 A 买过 shoes 和 belts,那么 A 要添加到这两个客户的集合中。
for row in reader:
    customer = (row[0],row[1])
    category = row[3]
    if category == "Shoes":
        shoes.add(customer)
    if category == "Belt":
        belts.add(customer)
    if category == "Shirt":
        shirts.add(customer)
  • 接下来开始分析我们要解决的问题
print("%s 客户购买了鞋子" % len(shoes))
print("%s 客户购买了皮带" % len(belts))
print("%s 客户购买了鞋子但没有购买皮带,客户信息如下:" % len(shoes - belts))
for customer in shoes - belts:
    print(customer)

print("%s 客户既购买了鞋子,又购买了皮带和衬衫,客户信息如下:" % len(shoes & belts & shirts))
for customer in shoes & belts & shirts:
    print(customer)
  • 运行上述程序会出现以下结果
271 客户购买了鞋子
170 客户购买了皮带
240 客户购买了鞋子但没有购买皮带,客户信息如下:
('622744', 'Nader Group')
('723940', 'Nitzsche Group')
('651569', 'Ebert, Zemlak and Hills')
('050537', 'Hammes, Howell and Flatley')
('040901', 'Gislason, Skiles and Auer')
('185412', 'Goyette, Kessler and Goodwin')
('192686', 'Walter Inc')
('077116', 'Lang-Wunsch')
('725939', 'Ratke-Goldner')
....

9 客户既购买了鞋子,又购买了皮带和衬衫,客户信息如下:
('173693', 'Halvorson PLC')
('434955', 'Ledner-Kling')
('803666', 'Fritsch-Glover')
('004450', 'Beier-Bosco')
('727064', 'Bashirian, Beier and Watsica')
('343481', 'Mills Inc')
('527078', 'Kuvalis-Roberts')
('151300', "Upton, Runolfsson and O'Reilly")
('041711', 'Koepp-McLaughlin')

由于本篇文章只是为了说明 Python 和 Excel 的区别,所以只是打印出结果,但您可以修改它以将数据保存到csv文件中以导入到Excel或其他工具中。

所有代码如下:

import csv

shoes = set()
belts = set()
shirts = set()
with open("sample-sales.csv",'rt') as f:
    reader = csv.reader(f)
    for row in reader:
        customer = (row[0],row[1])
        category = row[3]
        if category == "Shoes":
            shoes.add(customer)
        if category == "Belt":
            belts.add(customer)
        if category == "Shirt":
            shirts.add(customer)

print("%s 客户购买了鞋子" % len(shoes))
print("%s 客户购买了皮带" % len(belts))
print("%s 客户购买了鞋子但没有购买皮带,客户信息如下:" % len(shoes - belts))
for customer in shoes - belts:
    print(customer)

print("%s 客户既购买了鞋子,又购买了皮带和衬衫,客户信息如下:" % len(shoes & belts & shirts))
for customer in shoes & belts & shirts:
    print(customer)

获得此结果肯定还有其他方法。事实上,我可能会在以后的文章中讨论其中的一些内容。然而,这里的想法是开始让人们考虑用简单的 python 脚本而不是 Excel 中的多个步骤来解决问题。

Python 脚本比 Excel 解决方案更好的原因有很多:

  • 所写的代码可以复用,下次需要运行类似的分析时,只需运行脚本即可。
  • 你可以把该程序和同事共享,让他们完成类似的分析,无需编写描述 Excel 中操作步骤的详细文档。
  • 该程序可以处理非常大的文件,处理数十万行上的文件不是问题,我在一台非常低端的笔记本电脑上在不到20秒的时间处理了一个百万行的文件。

通过本篇文章希望这可以帮助您了解 Python 在实际工作环境中的潜力。

为了及时收到文章更新,欢迎关注个人公众号:Python实战数据分析

发表评论

电子邮件地址不会被公开。