攝影或3C

Python: 如何在pandas.read_csv() or pandas.read_excel()中使用keep_default_na=False , na_values=[] 保留文件中的原始“NA”?

在数据处理中,正确处理缺失值是至关重要的。Pandas库提供了强大的工具来处理各种数据,其中 keep_default_na 参数在读取数据时扮演了关键角色。本文将详细介绍如何使用 keep_default_na 来控制Pandas如何识别和处理缺失值。

什么是 keep_default_na

keep_default_na 是在使用Pandas读取数据文件(如CSV或Excel文件)时的一个参数。它决定了Pandas是否应使用默认的缺失值识别列表,该列表包括诸如 'NA''NaN''NULL' 等常见缺失值标识。默认情况下,keep_default_na=True,这意味着Pandas会自动将这些标识转换为 NaN(不是数字),Pandas中表示缺失值的标准形式。

为什么要使用 keep_default_na=False

在某些情况下,数据集中的 'NA' 或类似字符串可能代表实际的数据值,而不是缺失值。例如,'NA' 可能代表“北美”而非“不适用”。在这些情况下,自动将这些值转换为 NaN 可能会导致数据丢失或误解。通过设置 keep_default_na=False,您可以阻止Pandas自动执行这种转换,从而保留数据的原始意图。

示例:保持 'NA' 为字符串

假设我们有一个名为 data.txt 的文件,内容如下:

Name,Location
Alice,NA
Bob,EU
Charlie,APAC

在这个CSV文件中,我们希望 'NA' 被视为一个普通字符串,下面是如何实现这一目标的代码示例:

# -*- coding: utf-8 -*-
"""
Created on Thu May 30 21:48:35 2024

@author: SavingKing
"""

import pandas as pd

# 正確使用 keep_default_na=False 應當在讀取CSV或Excel文件時使用

# 讀取CSV文件確保'NA'作為一個普通字符串
df = pd.read_csv('data.txt', keep_default_na=False)
# na_values=[]
#keep_default_na=False 確保Pandas在讀取數據時不會自動將任何值標記為缺失值
#na_values=[] 確保沒有額外的值被視為缺失值

# 打印DataFrame以验证'NA'是否被保留为字符串
print(df)

輸出結果:

如果使用keep_default_na=True:

程式碼可能使用以下邏輯:

try:
    limit=float(limit) #制定規格上下限
    operator = "> ="
except ValueError:
    limit = None
    operator = None

pandas的nan不會觸發ValueError
程式運作不如預期
這時候會希望”NA”
就保持自己原本的”NA”
不要自動轉換成pandas的nan
需要使用到 keep_default_na=False

keep_default_na 参数在 pandas.read_csv() 函数中的默认值确实是指 Pandas 的默认行为,而不是指读取 CSV 文件时保持文件中的原样数据。

keep_default_na 参数详解:
keep_default_na=True(默认设置):
这意味着 Pandas 会使用其内置的默认缺失值列表来识别和处理缺失值。这个列表通常包括如下值:”, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ”, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’。
使用这个设置,Pandas 在读取数据时会自动将这些值识别为缺失值(NaN)。
keep_default_na=False:
当设置为 False 时,Pandas 不会自动将上述默认列表中的值识别为缺失值。这意味着除非你通过 na_values 参数显式指定,否则这些值将被视为普通数据。
这在某些情况下非常有用,比如当你的数据中包含这些字符串,但你不希望它们被自动解释为缺失值时。
因此,keep_default_na 参数的设置决定了 Pandas 如何处理数据中可能出现的默认缺失值表示。如果你希望完全控制哪些值被视为缺失值,可以设置 keep_default_na=False 并通过 na_values 参数准确指定你希望识别为缺失的值。这样,Pandas 就只会根据你的指示处理缺失值,而不是依赖于其内置的默认缺失值识别逻辑。

在Python中,特别是在Pandas和NumPy库中,NaN (Not a Number) 的类型是 float。这是因为 NaN 是基于IEEE浮点数标准定义的,而该标准是在浮点数系统中定义的。在Pandas和NumPy中,NaN 用来表示缺失值或者未定义的数值,它是浮点类型的一种特殊形式。

代码段中,df["Location"][0] 返回 nan,其类型通过 type(df["Location"][0]) 查询得知是 float。这表明 nan 是按照浮点数处理的,这也是为什么在Pandas中处理含有 NaN 的数据时,即使原始数据列是整数类型,含有 NaN 的列也会自动转换成浮点类型。

这种设计允许 NaN 在数值计算中更为灵活地被处理,尤其是在涉及缺失数据的统计分析和数值运算中。例如,任何与 NaN 的算术运算都会返回 NaN,这有助于在数据分析中保持结果的一致性和预期的行为。

在 Pandas 和 NumPy 中,NaN(Not a Number)在进行数学运算时并不被视为 0。相反,NaN 有一些特殊的行为规则,尤其是在涉及聚合函数(如计算平均值、总和等)的情况下:

  1. 求和(Sum):如果数组或数据列中包含 NaN,那么其总和也将是 NaN。这意味着任何包含 NaN 的计算不会简单地忽略它,而是直接返回 NaN
  2. 平均值(Mean):类似地,如果计算平均值时数据中包含 NaN,结果同样会是 NaN

这种行为的主要原因是为了保持数据的完整性,避免因忽略 NaN 而得到可能误导的统计结果。不过,Pandas 提供了处理 NaN 值的方法来计算这些统计值而不被 NaN 影响:

  • 使用 sum()mean() 等方法时,可以添加参数 skipna=True(这也是默认设置),这样计算时会自动忽略 NaN 值。例如,df['column'].sum()df['column'].mean() 默认不考虑 NaN 值。

例如,让我们看一个涉及 Pandas 的简单例子:

在这个例子中,None(在 Pandas 中自动转换为 NaN)被 sum() 和 mean() 方法在计算时忽略掉了。如果不想忽略 NaN,可以设置 skipna=False,但这通常不是期望的行为,因为会导致结果为 NaN

推薦hahow線上學習python: https://igrape.net/30afN

pd.read_csv?

Signature:

Signature:
pd.read_csv(
    filepath_or_buffer: 'FilePath | ReadCsvBuffer[bytes] | ReadCsvBuffer[str]',
    *,
    sep: 'str | None | lib.NoDefault' = <no_default>,
    delimiter: 'str | None | lib.NoDefault' = None,
    header: "int | Sequence[int] | None | Literal['infer']" = 'infer',
    names: 'Sequence[Hashable] | None | lib.NoDefault' = <no_default>,
    index_col: 'IndexLabel | Literal[False] | None' = None,
    usecols=None,
    dtype: 'DtypeArg | None' = None,
    engine: 'CSVEngine | None' = None,
    converters=None,
    true_values=None,
    false_values=None,
    skipinitialspace: 'bool' = False,
    skiprows=None,
    skipfooter: 'int' = 0,
    nrows: 'int | None' = None,
    na_values=None,
    keep_default_na: 'bool' = True,
    na_filter: 'bool' = True,
    verbose: 'bool' = False,
    skip_blank_lines: 'bool' = True,
    parse_dates: 'bool | Sequence[Hashable] | None' = None,
    infer_datetime_format: 'bool | lib.NoDefault' = <no_default>,
    keep_date_col: 'bool' = False,
    date_parser=<no_default>,
    date_format: 'str | None' = None,
    dayfirst: 'bool' = False,
    cache_dates: 'bool' = True,
    iterator: 'bool' = False,
    chunksize: 'int | None' = None,
    compression: 'CompressionOptions' = 'infer',
    thousands: 'str | None' = None,
    decimal: 'str' = '.',
    lineterminator: 'str | None' = None,
    quotechar: 'str' = '"',
    quoting: 'int' = 0,
    doublequote: 'bool' = True,
    escapechar: 'str | None' = None,
    comment: 'str | None' = None,
    encoding: 'str | None' = None,
    encoding_errors: 'str | None' = 'strict',
    dialect: 'str | csv.Dialect | None' = None,
    on_bad_lines: 'str' = 'error',
    delim_whitespace: 'bool' = False,
    low_memory=True,
    memory_map: 'bool' = False,
    float_precision: "Literal['high', 'legacy'] | None" = None,
    storage_options: 'StorageOptions' = None,
    dtype_backend: 'DtypeBackend | lib.NoDefault' = <no_default>,
) -> 'DataFrame | TextFileReader'

pd.read_csv.__doc__

keep_default_na : bool, default True
Whether or not to include the default NaN values when parsing the data.
Depending on whether na_values is passed in, the behavior is as follows:

* If `keep_default_na` is True, and `na_values` are specified, `na_values`
  is appended to the default NaN values used for parsing.
* If `keep_default_na` is True, and `na_values` are not specified, only
  the default NaN values are used for parsing.
* If `keep_default_na` is False, and `na_values` are specified, only
  the NaN values specified `na_values` are used for parsing.
* If `keep_default_na` is False, and `na_values` are not specified, no
  strings will be parsed as NaN.

Note that if `na_filter` is passed in as False, the `keep_default_na` and
`na_values` parameters will be ignored.

keep_default_na:布尔值,默认为 True
在解析数据时是否包含默认的 NaN 值。具体行为取决于是否传入了 na_values 参数:

  • 如果 keep_default_na 为 True,并且指定了 na_values,则 na_values 中指定的值将被添加到用于解析的默认 NaN 值中。
  • 如果 keep_default_na 为 True,并且没有指定 na_values,则只使用默认的 NaN 值进行解析。
  • 如果 keep_default_na 为 False,并且指定了 na_values,则只使用 na_values 中指定的 NaN 值进行解析。
  • 如果 keep_default_na 为 False,并且没有指定 na_values,则没有任何字符串会被解析为 NaN。

请注意,如果传入了 na_filter 参数且其值为 False,则 keep_default_na 和 na_values 参数将被忽略。

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡