在数据处理中,正确处理缺失值是至关重要的。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
有一些特殊的行为规则,尤其是在涉及聚合函数(如计算平均值、总和等)的情况下:
- 求和(Sum):如果数组或数据列中包含
NaN
,那么其总和也将是NaN
。这意味着任何包含NaN
的计算不会简单地忽略它,而是直接返回NaN
。 - 平均值(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