数据清洁和准备使用Python中的PANDAS库进行分析的指南
#编程 #编码 #python #learning

尝试使用未精制的数据进行分析就像试图在摇摇欲坠的基础上建造坚固的房屋。
这会导致错误的决定,这可能会花费您时间,金钱和声誉。为了避免这种情况,您需要在使用数据之前清洁数据并验证其质量和准确性。干净的数据是良好决策的基础。
本文的目的是向您展示如何使用各种PANDAS方法和功能清洁,转换和探索数据集。到本文结束时,您将更好地了解如何使用Python中的Pandas库与大而混乱的数据集一起工作。

先决条件

要与本文一起遵循:

  • Python和Pandas的基本知识
  • Jupyter笔记本或Google Colab环境
  • here下载的FOIA数据集

什么是数据清洁

数据清洁是识别和纠正或删除错误,不准确的数据的过程。这是数据科学工作流程中的重要一步,可确保数据准确,完整且可靠。
数据清洁是数据分析和决策的重要一步,因为它可以提高数据的准确性,可靠性和效率。但是,由于不同的数据集可能需要不同的方法和方法,因此没有用于清理数据清洁的单一适合的技术。因此,应根据每个数据项目的特定需求和目标来量身定制数据清理。

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

  • 删除重复项:这涉及删除相同的记录,或在不同列中具有相同的值。例如,如果客户有两个带有相同名称和电子邮件地址的条目,则可以将其中一个作为重复删除。
  • 处理丢失值:这涉及处理具有不完整值的记录,也称为空值。它们被代表为nan。数据框中的缺少值可能是由于数据输入错误或数据收集过程中缺少数据而导致的。例如,如果调查受访者没有回答问题,那么该问题的价值将为无效。可以通过删除缺失值来处理它们,用默认值替换它们或使用统计方法归纳它们。
  • 标准化格式:这涉及标准化功能,以使数据遵循一致的格式。这确保了值围绕一系列数字收敛,而不仅仅是随机散布。例如,如果一个功能具有不同单位的值,例如仪表和脚,则可以转换为通用单元,例如米。
  • 验证数据:这涉及确定数据中的错误和不一致之处,例如异常值或混合数据类型的存在。这可能是印刷错误的结果,也可能是编码和解码的字节中的错误。例如,如果一个功能具有应该是数字的值,但是其中一些是字符串,则可以将其转换为数字值或以无效的数据删除。

在本文中,我将分享我的思维过程和准备《信息自由法》(FOIA)数据集的步骤,用于使用Python的Pandas库进行分析。该数据集包含有关2010财年至2019年美国小型企业管理局(SBA)的7(a)贷款计划的信息。7(a)贷款计划是SBA为小型企业提供财务援助的主要计划。<
该数据集是从改头换面项目获得的,这是一个每周一次的系列,挑战数据爱好者使用数据和图表来讲述故事。
此外,您可以在我的github here上找到数据清洁技术的源代码。

阅读和检查数据

开始,将熊猫库导入您的环境中,然后将CSV文件加载到大熊猫数据框架中:

import pandas as pd
pd.set_option("display.max_columns", None)

# Define custom datatypes for specific columns
dtypes = {"BankZip": str, "BusinessAge": str}

# Read the CSV file using the specified encoding and column datatypes
foiaData = pd.read_csv("foia-7afy2010-fy2019-asof-220930.csv", encoding="ISO-8859-1", dtype=dtypes)

通过将Display.max_columns设置为无,您告诉Pandas显示所有列而没有任何截断。当您使用包含许多列的宽数据集或数据帧时,这特别有用。

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

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

描述:当“ UTF-8”编码与文件内容不匹配时,会发生此错误。通常,当文件中的字符无法使用指定的编码解码时。
解决方案:要解决此问题,请在读取文件时指定正确的编码,如上所述。

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

描述:此警告是由于“ Bankzip”和“ Businessage”列中的混合数据类型引起的。它表明这些列中的数据可能不一致地相同类型。
解决方案:要解决这个问题,请最初将这些列的数据类型更改为“ str”(String)。这使您可以检查数据,然后在必要时将其转换为适当的数据类型。创建一个名为“ dtypes”的字典(您可以选择一个名称),其中列名称为键,所需的数据类型作为值。然后将此字典传递到加载数据时'read_csv()'函数的“ dtype”参数。这样可以确保使用指定的数据类型正确加载数据。

接下来,使用head()shapedtypes方法研究数据框,以了解数据结构,大小,列和数据类型。
这是我的少数观察结果;

  • 数据集具有 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”,“ naicsDescription”,“ naicsdescription”,“ franchisecode”,“ frranchisecode”,“ franchisename”,“ franchisename”,“,”,“,”,“,”,“,” “ Businessage”,“ Payinfulldate”和“ ChargeOffDate”。这些缺失值可能表明数据未记录或用于某些贷款。 例如,“ Franchisecode”和“ CranchisEname”仅与特许经营业务的贷款有关,因此非合资业务缺失它们。
  • 除了两列以外,我们在读取数据时专门更改了数据类型,其他一些列,例如“ asofdate”,“ applovaldate”,“ firstDisBursementDate”,“ payinfulldate”和“ payinfulldate”和“ ChargeOffDate”和“ ChargeOffDate”具有不正确的数据类型。
  • Bankzip和BankName列有一些数据质量问题。 BankZip列仅应包含整数值,但是它具有字符串值“ M5H 1”,这可能是错别字。 BankName列有一个值“缺少的MainBankid”,该值表示缺少值。这就是最初提出混合数据类型警告的原因。

1.处理数据质量问题

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

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

“ |”操作员称为“或”操作员。这意味着如果任何一个条件为true,则行将掉落。

2.处理空/缺失值

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

探索数据列

确定数据集中的哪些列包含空值。您可以在数据框架上使用ISNA()方法来实现这一目标。此方法将返回与原始形状相同形状的数据框架,但带有布尔值表示存在丢失的数据。然后,您可以将sum()函数与isna()一起计算每列中缺少值的数量。

foiaData.isna().sum()

此代码将返回以下结果:


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

掉下行

让我们从包含缺少值的“ borrname”的第一列开始,该值代表借款人的名称。由于只有34行缺少值,因此建议丢弃这些行。
这是在代码中实现此操作的方法:

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

本列在数据集中非常重要,这使其具有误导性代替另一个借款人的名称。虽然一个选项是输入“丢失名称”,但鉴于丢失值数量有限,这种操作似乎是不必要的。请记住,您选择的方法应根据项目的特定要求量身定制,而不是一个尺寸适合的解决方案。

掉落列

接下来,我们分别拥有37241和529342缺失值的Bankfdicnumber和Bankncuanumber列。这些列代表银行的FDIC编号和银行的NCUA编号。包括这些列(包括这些列)为数据集增加了复杂性,而不必提供显着的分析价值。因此,删除这些列可以使您专注于与您的分析目标更直接相关的数据的关键方面,从而导致更简洁而专注的数据集。
我们可以使用此代码来实现这一点;

# Drop the BankFDICNumber and BankNCUANumber columns
columns_to_drop=["BankFDICNumber", "BankNCUANumber"]
foiaData.drop(columns_to_drop,axis=1,inplace=True)

引入二进制指标

超过90%的记录在特许经营列和系列列列中缺少值,从而增加了数据稀疏性并降低了整体数据质量。这些列代表特许代码和特许经营的名称。
引入一个Hasfranchise列,具有两个不同的值(0和1),这些值表明记录是否具有特许经营(1)(1)(0)简化了数据集,使其更可读性和直观用于分析。

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

然后丢弃特许权和系列列列

# Drop the FranchiseCode and FranchiseName columns
columns_to_drop=["FranchiseCode", "FranchiseName"]
foiaData.drop(columns_to_drop,axis=1,inplace=True)

归类的分类处理

NAICSCODE,NAICSDESCRIPTION,CONGRASSIONDERTICT和BUSISTRESTYPE只有少数缺少的值,并且由于它们是分类列,因此丢失的值可以用最常见的值估算。

# Fill missing values in NaicsCode, NaicsDescription,
# CongressionalDistrict, and BusinessType with the most frequent value
for 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 == CT
ctmode_projectstate=foiaData.loc[foiaData["ProjectState"]=="CT","ProjectCounty"].mode()[0]
foiaData["ProjectCounty"].fillna(ctmode_projectstate,inplace=True)

掉落列

Businessage列的缺失值超过75%。商业列中丢失值的高比例可能会显着影响任何分析或从中获得的见解的可靠性。在这种情况下,插补不可行,您可以考虑放下列以维持数据完整性并专注于其他更完整的变量。

# Drop the BusinessAge column
foiaData.drop("BusinessAge",axis=1,inplace=True)

处理日期列:处理丢失的日期

付费数字中的丢失值和ChargeOffDate中的丢失值表示某些贷款不可用。这两个列中的值是直接排他性的,即,一个存在自动的存在意味着另一个的不存在。例如,Payinfulldate仅适用于全额支付的贷款,因此其他类型的贷款丢失了。处理缺失值的一种可能解决方案是使用“不适用”之类的单词向其他数据的其他用户发送明确的消息,但是使用此技术意味着您将无法将列的数据类型更改为DateTime格式。这是因为DateTime列只能包含有效的日期或时间戳值,而诸如“不适用”或“数据输入延迟”之类的单词(对于FirstDisBursementDate列中的缺少值)不是有效的DateTime值。

取而代之的是,您只需将其作为null,然后在分析中进行记录,以确保用户了解缺少日期值的原因并正确解释它们。这种方法保持数据的完整性,同时允许清晰地沟通其限制。

结论

我们探索了使用Python中的Pandas库来处理数据集中缺少数据的各种技术。
这是涵盖的主要技术的简洁分解:

  1. 删除行和列:删除缺少值的条目以维持数据质量。
  2. 介绍二进制指标:通过使用“ Hasfranchise”等指标,简化了使用丢失数据的列。
  3. 将最频繁的值归纳:使用最常见的值填充分类列。
  4. 归为一致的值:使用与另一列相关的最频繁的值归为丢失。
  5. 处理日期列:当缺失值表示非应用性并记录逻辑时,将日期列留为空白。 根据上下文和分析目标,您可以选择最合适的方法来保持数据质量,完整性和透明度。通过仔细处理缺失的价值,您可以确保您的分析基于可靠且有意义的见解。

确保记录丢失的数据的处理,无论是通过插补,标记还是丢弃,以维持分析过程中的透明度。

在本文中,我们学会了如何使用Pandas处理Python中缺少的数据。但是,我们如何使用这些数据回答有关小型企业融资的一些重要问题?请继续关注下一篇文章,我们将使用PostgreSQL和Tableau探索数据分析。