前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三个你应该注意的错误

三个你应该注意的错误

作者头像
磐创AI
发布2024-03-12 17:50:37
710
发布2024-03-12 17:50:37
举报

在编程中,我们可能犯错,但这并不一定代表愚蠢,然而常常会导致意外结果。

有些错误就像明亮的钻石,很容易被察觉。即使你忽略它们,编译器(或解释器)也会通过报错提示我们。

另一方面,还存在一些“隐形”错误,难以察觉,但却可能引发严重问题。尽管这类错误不会触发警告,但可能导致函数或操作以出人意料的方式运行,从而产生未察觉到的结果变化。

我们接下来将深入探讨其中的三个问题。

你是一名在零售公司工作的数据分析师。你被要求分析最近一系列促销活动的结果。在此分析中的一个任务是计算每个促销和总销售数量。

假设促销数据存储在一个DataFrame中,看起来像下面这样(实际上不会这么小):

如果你想跟随并自己做示例,以下是用于创建这个DataFrame的Pandas代码:

代码语言:javascript
复制
import pandas as pd

promotion = pd.DataFrame(
    {
        "promotion_code": ["A2", "A1", "A2", "B1", "A2", None, "A2", "B1", None, "A1"],
        "sales_qty": [34, 32, 26, 71, 44, 27, 64, 33, 45, 90],
        "price": [24.5, 33.1, 64.9, 52.0, 29.0, 47.5, 44.2, 25.0, 42.5, 30.0]
    }
)

计算每个促销代码的总销售数量非常简单。你只需要使用groupby函数:

代码语言:javascript
复制
promotion.groupby("promotion_code").agg(
    
    total_promo_sales = ("sales_qty", "sum")

)

# output         
promotion_code    total_promo_sales
            A1                  122
            A2                  168
            B1                  104

当你将它们相加以获得总销售数量时,你会得到394,但正确的总销售数量是466。

代码语言:javascript
复制
promotion_sales = promotion.groupby("promotion_code").agg(
    total_promo_sales = ("sales_qty", "sum")
)

promotion_sales.total_promo_sales.sum() # output 394

promotion.sales_qty.sum() # output 466

这个差异的原因是缺少促销代码值(即None)。由于某种原因,一些促销代码值未被记录。

groupby函数默认忽略缺失值。要包含它们在计算中,你需要将dropna参数设置为False

代码语言:javascript
复制
promotion.groupby("promotion_code", dropna=False).agg(
    
    total_promo_sales = ("sales_qty", "sum")

)

# output         
promotion_code    total_promo_sales
            A1                  122
            A2                  168
            B1                  104
           NaN                   72

我们的示例DataFrame只有10行,所以我们能够注意到缺失值。然而,你可能会处理更大的DataFrame(数千或数百万行),这样就不可能进行视觉检查了。

始终牢记缺失值并检查它们。


我们要谈论的第二个悄悄错误是链式索引。

在Pandas的DataFrame上进行索引非常有用,主要用于获取和设置数据的子集。

我们可以使用行和列标签以及它们的索引值来访问特定的行和标签集。

考虑我们之前示例中的促销DataFrame。假设我们想要更新第二行的销售数量值。下面是一种做法:

代码语言:javascript
复制
promotion["sales_qty"][1] = 45

我们首先选择销售数量列,然后选择索引(也是标签)为1的第二行。这被称为“链式索引”,应该避免使用。

当你执行这行代码时,你会得到一个SettingWithCopyWarning。操作按预期执行(即值更新为45),但我们不应该忽视这个警告。

根据Pandas文档,“分配给链式索引的乘积具有内在的不可预测的结果”。主要原因是我们无法确定索引操作是否会返回视图或副本。因此,我们尝试更新的值可能会更新,也可能不会更新。

进行此操作的更好(且有保证的)方法是使用loc方法,它保证直接在DataFrame上执行操作。

这是如何更新销售数量列的第二行值:

代码语言:javascript
复制
promotion.loc[1, "sales_qty"] = 46

第三个悄悄错误与lociloc方法之间的差异有关。这些方法用于从DataFrame中选择子集。

  • loc:按行和列的标签进行选择
  • iloc:按行和列的位置进行选择

默认情况下,Pandas将整数值(从0开始)分配为行标签。因此,行标签和索引值变得相同。

让我们在我们的促销DataFrame上做一个简单的示例。虽然它很小,但足够演示我即将解释的问题。

考虑一个需要选择前4行的情况。这是如何使用iloc方法来执行的:

代码语言:javascript
复制
promotion.iloc[:4, :]

# output
  promotion_code sales_qty price
0             A2        34  24.5
1             A1        32  33.1
2             A2        26  64.9
3             B1        71  52.0

逗号前面的部分确定要选择的行,逗号后面的部分是用于选择列的(“:”表示所有列)。

现在让我们使用loc方法执行相同的操作。由于行标签和索引值是相同的,我们可以使用相同的代码(只需将iloc更改为loc)。

代码语言:javascript
复制
promotion.loc[:4, :]

# output
  promotion_code sales_qty price
0             A2        34  24.5
1             A1        32  33.1
2             A2        26  64.9
3             B1        71  52.0
4             A2        44  29.0

嗯,输出不一样。当我们使用loc方法时,我们多了一行。

原因是使用loc方法时,上限是包含的,因此最后一行(具有标签4的行)被包括在内。

当使用iloc方法时,上限是不包含的,因此索引为4的行不包括在内。

这可能是一个小差异,但肯定会导致意外结果,并具有误导你的分析的潜力。

lociloc方法对许多任务非常有用,但你应该了解它们之间的差异。


引发错误的错误是重要的,但我们需要立即采取必要措施来修复它们。

更阔怕的是未知的错误。它们往往会引起间接效应和其他隐患。在本文中,我们学习了三种这样的情况。

感谢阅读。愿你学有所获!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档