龙空技术网

在 Python 中使用 Pandas 库进行数据清理和分析准备指南

启辰8 58

前言:

眼前各位老铁们对“python数据分析库的描述错误”大约比较关注,小伙伴们都需要学习一些“python数据分析库的描述错误”的相关文章。那么小编同时在网摘上网罗了一些关于“python数据分析库的描述错误””的相关内容,希望朋友们能喜欢,你们快快来学习一下吧!

尝试使用未经提炼的数据进行分析就像试图在摇摇欲坠的地基上建造一座坚固的房子。

它会导致错误的决定,从而浪费您的时间、金钱和声誉。为了避免这种情况,您需要在使用数据之前清理数据并验证其质量和准确性。干净的数据是良好决策的基础。

本文的目标是向您展示如何使用各种 Pandas 方法和函数来清理、转换和探索数据集。读完本文后,您将更好地了解如何使用 Python 中的 Pandas 库处理大型且混乱的数据集。

先决条件

要阅读本文,您将需要:

Python 和 Pandas 的基本知识Jupyter Notebook 或 Google Colab 环境从这里下载的 FOIA 数据集什么是数据清洗

数据清理是识别、纠正或消除数据中的错误、不一致和不准确的过程。这是数据科学工作流程中的重要步骤,可确保数据准确、完整和可靠。

数据清洗是数据分析和决策的重要一步,可以提高数据的准确性、可靠性和效率。然而,没有一种通用的数据清理技术,因为不同的数据集可能需要不同的途径和方法。因此,数据清理应根据每个数据项目的具体需求和目标进行定制。

一些常见的数据清理技术是:

删除重复项:这涉及删除相同的记录或在不同列中具有相同值的记录。例如,如果客户有两个具有相同姓名和电子邮件地址的条目,则可以将其中一个作为重复项删除。处理缺失值:这涉及处理具有不完整值(也称为空值)的记录。它们表示为 NaN。数据框中的缺失值可能是由于数据输入错误或数据收集期间丢失数据造成的。例如,如果调查受访者没有回答问题,则该问题的值将为空。可以通过删除缺失值、用默认值替换它们或使用统计方法估算缺失值来处理缺失值。标准化格式:这涉及标准化功能,以便数据遵循一致的格式。这确保了值收敛在一定范围的数字周围,而不是随机分布。例如,如果某个要素具有不同单位的值(例如米和英尺),则可以将它们转换为通用单位(例如米)。验证数据:这涉及识别数据中的错误和不一致之处,例如异常值或混合数据类型的存在。这可能是由于印刷错误或字节编码和解码错误造成的。例如,如果某个要素的值应该是数字,但其中一些是字符串,则可以将它们转换为数字值或作为无效数据删除。

在本文中,我将分享我准备信息自由法案 (FOIA) 数据集以使用 Python 中的 Pandas 库进行分析的思维过程和步骤。该数据集包含有关美国小企业管理局 (SBA) 2010 至 2019 财年 7(a) 贷款计划的信息。7(a) 贷款计划是 SBA 向小企业提供财务援助的主要计划。

该数据集来自 Makeover Monday 项目,这是一个每周一次的系列,挑战数据爱好者使用数据和图表来讲述故事。此外,您还可以在我的 GitHub上

找到本文中使用的数据清理技术的源代码。

读取和检查数据

首先,将 Pandas 库导入到您的环境中,并将 CSV 文件加载到 Pandas 数据框中:

import pandas as pdpd.set_option("display.max_columns", None)# Define custom datatypes for specific columnsdtypes = {"BankZip": str, "BusinessAge": str}# Read the CSV file using the specified encoding and column datatypesfoiaData = pd.read_csv("foia-7afy2010-fy2019-asof-220930.csv", encoding="ISO-8859-1", dtype=dtypes)

通过将 display.max_columns 设置为 None,您可以告诉 Pandas 显示所有列而不进行任何截断。当您处理包含大量列的宽数据集或数据框时,这特别有用。

尝试仅使用其名称读取此 CSV 文件时,您可能会遇到错误和警告:

错误:

UnicodeDecodeError: 'utf-8' codec can't decide bytes in position 246121-246122: invalid continuation byte

描述:当“utf-8”编码与文件内容不匹配时,会出现此错误。当文件中存在无法使用指定编码进行解码的字符时,通常会发生这种情况。

解决方案:要解决此问题,请在读取文件时指定正确的编码,如上所示。

警告:

DtypeWarning: Columns (13,32) have mixed types. Specify dtype option on import or set low_memory=False"

描述:此警告是由于“BankZip”和“BusinessAge”列中的数据类型混合而出现的。这表明这些列中的数据可能不一致。

解决方案:要解决此问题,请首先将这些列的数据类型更改为“str”(字符串)。这允许您检查数据,并在必要时将其转换为适当的数据类型。创建一个名为“dtypes”的字典(您可以选择不同的名称),其中列名作为键,所需的数据类型作为值。然后在加载数据时将此字典传递给“read_csv()”函数的“dtype”参数。这可确保使用指定的数据类型正确加载数据。

head()接下来,使用、shape、 和方法研究数据框架,dtypes以了解数据结构、大小、列和数据类型。

以下是我的一些观察;

该数据集有545,751 行39 列。每行代表 SBA 根据 7(a) 计划批准的贷款,每列包含与贷款相关的变量,例如借款人的姓名、地址、业务类型、贷款金额、利率、期限、状态等。

|   AsOfDate | Program   | BorrName                       | BorrStreet                   | BorrCity    | BorrState   |   BorrZip | BankName                                  |   BankFDICNumber |   BankNCUANumber | BankStreet           | BankCity     | BankState   |   BankZip |   GrossApproval |   SBAGuaranteedApproval | ApprovalDate   |   ApprovalFiscalYear | FirstDisbursementDate   | DeliveryMethod   | subpgmdesc                  |   InitialInterestRate |   TermInMonths |   NaicsCode | NaicsDescription                                                       |   FranchiseCode |   FranchiseName | ProjectCounty   | ProjectState   | SBADistrictOffice                 |   CongressionalDistrict | BusinessType   |   BusinessAge | LoanStatus   | PaidInFullDate   |   ChargeOffDate |   GrossChargeOffAmount |   RevolverStatus |   JobsSupported ||-----------:|:----------|:-------------------------------|:-----------------------------|:------------|:------------|----------:|:------------------------------------------|-----------------:|-----------------:|:---------------------|:-------------|:------------|----------:|----------------:|------------------------:|:---------------|---------------------:|:------------------------|:-----------------|:----------------------------|----------------------:|---------------:|------------:|:-----------------------------------------------------------------------|----------------:|----------------:|:----------------|:---------------|:----------------------------------|------------------------:|:---------------|--------------:|:-------------|:-----------------|----------------:|-----------------------:|-----------------:|----------------:||   20220930 | 7A        | RIVERLAND LASER LLC            | 703 ST CROIX STREET          | RIVER FALLS | WI          |     54022 | First National Community Bank             |             5357 |              nan | 109 E 2nd St         | NEW RICHMOND | WI          |     54017 |          491000 |                  441900 | 10/01/2009     |                 2010 | 10/01/2009              | OTH 7A           | Guaranty                    |                  6    |            120 |      332812 | Metal Coating, Engraving (except Jewelry and Silverware), and Allied S |             nan |             nan | PIERCE          | WI             | WISCONSIN DISTRICT OFFICE         |                       7 | CORPORATION    |           nan | PIF          | 08/31/2016       |             nan |                      0 |                0 |              11 ||   20220930 | 7A        | MARTINEZ AND MARTINEZ INC.     | 2430 DALY AVE                | LOS ANGELES | CA          |     90031 | Gain FCU                                  |              nan |             3943 | 1800 W Magnolia Blvd | BURBANK      | CA          |     91506 |           35000 |                   31500 | 10/01/2009     |                 2010 | 04/01/2011              | OTH 7A           | Guaranty                    |                  6.5  |             60 |      541213 | Tax Preparation Services                                               |             nan |             nan | LOS ANGELES     | CA             | LOS ANGELES DISTRICT OFFICE       |                      28 | CORPORATION    |           nan | PIF          | 04/30/2016       |             nan |                      0 |                1 |               9 ||   20220930 | 7A        | Erez & Koby Genesis Investment | 10999 Reed Hartman Hwy, SUit | CINCINNATI  | OH          |     45242 | JPMorgan Chase Bank, National Association |              628 |              nan | 1111 Polaris Pkwy    | COLUMBUS     | OH          |     43240 |          100500 |                   50250 | 10/01/2009     |                 2010 | 10/01/2009              | SBA EXPRES       | FA$TRK (Small Loan Express) |                  4.51 |             54 |      722110 | Full-Service Restaurants                                               |             nan |             nan | HAMILTON        | OH             | COLUMBUS DISTRICT OFFICE          |                       1 | CORPORATION    |           nan | PIF          | 05/31/2012       |             nan |                      0 |                0 |              20 ||   20220930 | 7A        | Square Burger LLC              | 115 Kentucky Street          | McKinney    | TX          |     75069 | American Bank of Commerce                 |            18609 |              nan | 530 E Hwy 62/82      | WOLFFORTH    | TX          |     79382 |          288000 |                  259200 | 10/01/2009     |                 2010 | 10/01/2009              | PLP              | Guaranty                    |                  6    |            120 |      722110 | Full-Service Restaurants                                               |             nan |             nan | COLLIN          | TX             | DALLAS / FT WORTH DISTRICT OFFICE |                       3 | CORPORATION    |           nan | PIF          | 07/31/2014       |             nan |                      0 |                0 |              18 ||   20220930 | 7A        | HIT FITNESS LLC                | 614 A SOUTH MAIN STREET      | MAULDIN     | SC          |     29662 | Truist Bank                               |             9846 |              nan | 214 N Tryon St       | CHARLOTTE    | NC          |     28202 |           37000 |                   18500 | 10/01/2009     |                 2010 | 10/01/2009              | SBA EXPRES       | FA$TRK (Small Loan Express) |                  7.5  |             60 |      812199 | Other Personal Care Services                                           |             nan |             nan | GREENVILLE      | SC             | SOUTH CAROLINA DISTRICT OFFICE    |                       4 | CORPORATION    |           nan | PIF          | 09/30/2013       |             nan |                      0 |                0 |               6 |
数据集的某些列中缺少一些值,例如“BankFDICNumber”、“BankNCUANumber”、“FirstDisbursementDate”、“NaicsCode”、“NaicsDescription”、“FranchiseCode”、“FranchiseName”、“BusinessAge”、“PaidInFullDate”和“收费日期”。这些缺失值可能表明某些贷款的数据未记录或不可用。例如,“FranchiseCode”和“FranchiseName”仅与特许经营企业的贷款相关,因此对于非特许经营企业缺少它们。除了我们在读取数据时专门更改数据类型的两列之外,其他一些列(例如“AsOfDate”、“ApprovalDate”、“FirstDisbursementDate”、“PaidInFullDate”和“ChargeOffDate”)的数据类型不正确。BankZip 和 BankName 列存在一些数据质量问题。BankZip 列应该只包含整数值,但它有一个字符串值“M5H 1”,这可能是一个拼写错误。BankName 列有一个值“MISSINGMAINNBANKID”,这表示缺少值。这些是最初提出混合数据类型警告的原因。1. 处理数据质量问题

要解决这些问题,您可以使用以下代码删除具有这些值的两行:

# Drop rows where BankZip is M5H 1 or BankName is MISSINGMAINBANKIDbankzip_condition = foiaData["BankZip"] == "M5H 1"bankname_condition = foiaData["BankName"] == "MISSINGMAINBANKID"drop_condition = bankzip_condition | bankname_conditionfoiaData.drop(foiaData[drop_condition].index, inplace=True)

“|” 运算符称为“OR”运算符。这意味着如果任一条件为真,则行将被删除。

2. 处理空值/缺失值

在本节中,我将查看数据集中包含缺失数据的每一列,探索处理这些缺失值的各种技术。

探索数据列

确定数据集中的哪些列包含空值。您可以通过在 DataFrame 上使用 isna() 方法来实现此目的。此方法将返回与原始形状相同的 DataFrame,但具有指示是否存在缺失数据的布尔值。然后,您可以使用 sum() 函数和 isna() 来计算每列中缺失值的数量。

foiaData.isna().sum()

这段代码将返回以下结果:

AsOfDate                      0Program                       0BorrName                     34BorrStreet                    0BorrCity                      0BorrState                     0BorrZip                       0BankName                      0BankFDICNumber            37241BankNCUANumber           529342BankStreet                    2BankCity                      2BankState                     2BankZip                       2GrossApproval                 0SBAGuaranteedApproval         0ApprovalDate                  0ApprovalFiscalYear            0FirstDisbursementDate     65434DeliveryMethod                0subpgmdesc                    0InitialInterestRate           0TermInMonths                  0NaicsCode                    11NaicsDescription            592FranchiseCode            498139FranchiseName            498240ProjectCounty                 2ProjectState                  0SBADistrictOffice             0CongressionalDistrict        29BusinessType                  5BusinessAge              434057LoanStatus                    0PaidInFullDate           235140ChargeOffDate            518461GrossChargeOffAmount          0RevolverStatus                0JobsSupported                 0dtype: int64
删除行

让我们从包含缺失值的第一列开始——“BorrName”,它代表借款人的姓名。由于只有 34 行缺少值,因此建议删除这些行。

以下是如何在代码中实现这一点:

# Drop rows with missing Borrower NamefoiaData.dropna(subset=["BorrName"],inplace=True)

该列在数据集中具有重要意义,因此用其他借款人的姓名替换会产生误导。虽然可以选择输入“MISSING NAME”,但考虑到缺失值的数量有限,这种操作似乎没有必要。请记住,您选择的方法应根据项目的具体要求进行定制,而不是一刀切的解决方案。

删除列

接下来,我们的 BankFDICNumber 和 BankNCUANumber 列分别包含 37241 和 529342 个缺失值。各列代表银行的 FDIC 号码和银行的 NCUA 号码。包含这些列会增加数据集的复杂性,但不一定提供重要的分析价值。因此,删除这些列可以让您专注于与分析目标更直接相关的数据关键方面,从而获得更简洁、更有针对性的数据集。

我们可以使用这段代码来实现这一点;

# Drop the BankFDICNumber and BankNCUANumber columnscolumns_to_drop=["BankFDICNumber", "BankNCUANumber"]foiaData.drop(columns_to_drop,axis=1,inplace=True)
引入二进制指标

超过 90% 的记录在 FranchiseCode 和 FranchiseName 列中缺少值,从而增加了数据稀疏性并降低了整体数据质量。这些列代表特许经营代码和特许经营名称。

引入 HasFranchise 列,该列具有两个不同的值(0 和 1),用于指示记录是否具有特许经营权 (1) 或不具有特许经营权 (0),从而简化了数据集,使其更易于分析且更直观。

# Create a HasFranchise columnfoiaData["HasFranchise"]=foiaData["FranchiseName"].notna().astype(int)

然后删除 FranchiseCode 和 FranchiseName 列

# Drop the FranchiseCode and FranchiseName columnscolumns_to_drop=["FranchiseCode", "FranchiseName"]foiaData.drop(columns_to_drop,axis=1,inplace=True)
使用插补处理分类

NaicsCode、NaicsDescription、CongressionalDistrict 和 BusinessType 仅具有几个缺失值,并且由于它们是分类列,因此可以使用最常见的值来估算缺失值。

# Fill missing values in NaicsCode, NaicsDescription,# CongressionalDistrict, and BusinessType with the most frequent valuefor column in ["NaicsCode", "NaicsDescription",               "CongressionalDistrict", "BusinessType"]:    most_frequent_value = foiaData[column].mode()[0]    foiaData[column].fillna(most_frequent_value, inplace=True)

可以对 ProjectCounty 列执行类似的处理技术,但在这种情况下,缺失值将使用 CountyState 列中最常见的值进行估算,以确保一致性。CountyState 列中最常见的值是“CT”,因此它在下面的代码中被硬编码:

# Fill missing values in ProjectCounty with the most frequent value in# ProjectState == CTctmode_projectstate=foiaData.loc[foiaData["ProjectState"]=="CT","ProjectCounty"].mode()[0]foiaData["ProjectCounty"].fillna(ctmode_projectstate,inplace=True)
删除列

BusinessAge 列有超过 75% 的缺失值。BusinessAge 列中缺失值的百分比较高可能会严重影响从中得出的任何分析或见解的可靠性。在这种情况下插补是不可行的,您可能会考虑删除该列以保持数据完整性并专注于其他更完整的变量。

# Drop the BusinessAge columnfoiaData.drop("BusinessAge",axis=1,inplace=True)
处理日期列:处理缺失的日期

PaidInFullDate 和 ChargeOffDate 中的缺失值表明某些贷款的数据不可用。两列中的值是直接互斥的,也就是说,其中一个值的存在自动意味着另一个值的不存在。例如,PaidInFullDate 仅适用于全额支付的贷款,因此其他类型的贷款缺少它。处理缺失值的一种可能的解决方案是使用“不适用”之类的词语向数据的其他用户发送明确的消息,但使用这种技术意味着您将无法将列的数据类型更改为日期时间格式。这是因为日期时间列只能包含有效的日期或时间戳值,

相反,您可以将其保留为空,然后在分析中记录这一点,以确保用户了解缺失日期值的原因并正确解释它们。这种方法可以保持数据的完整性,同时允许清楚地传达其局限性。

结论

我们探索了使用 Python 中的 Pandas 库处理数据集中缺失数据的各种技术。

以下是所涵盖的主要技术的简明细分:

删除行和列:删除缺失值的条目以保持数据质量。引入二进制指标:通过使用“HasFranchise”等指标来简化缺失数据的列。使用最常见的值进行插补:使用最常见的值填充分类列。使用一致的值进行插补:使用与另一列相关的最常见的值来插补缺失。处理日期列:当缺失值表示不适用时,将日期列留空并记录逻辑。根据上下文和您的分析目标,您可以选择最合适的方法来维护数据质量、完整性和透明度。通过仔细处理缺失值,您可以确保您的分析基于可靠且有意义的见解。

确保记录缺失数据的处理,无论是通过插补、标记还是删除,以保持分析过程的透明度。

标签: #python数据分析库的描述错误