处理缺失数据#
被视为“缺失”的值#
pandas 使用不同的标记值来表示缺失(也称为 NA)值,具体取决于数据类型。
对于 NumPy 数据类型,使用 numpy.nan。使用 NumPy 数据类型的缺点是原始数据类型将被强制转换为 np.float64 或 object。
对于 NumPy np.datetime64、np.timedelta64 和 NaT ,使用 PeriodDtype 。对于类型提示应用,使用 api.types.NaTType 。
对于 NA 、StringDtype (及其他位宽)、Int64Dtype (及其他位宽)、Float64Dtype 和 BooleanDtype ,使用 ArrowDtype 。这些类型将保持数据的原始数据类型。对于类型提示应用,使用 api.types.NAType 。
NA 语义#
警告
实验性:NA 的行为仍可能在没有警告的情况下发生更改。
从 pandas 1.0 开始,提供了一个实验性的 NA 值(单例),用于表示标量缺失值。NA 的目标是提供一个可以跨数据类型一致使用的“缺失”指示符(而不是根据数据类型使用 np.nan、None 或 pd.NaT)。
例如,当 Series 中的值缺失且 dtype 为可为空的整数类型时,它将使用 NA :
目前,pandas 尚未默认使用 NA 的这些数据类型来处理 DataFrame 或 Series ,因此您需要显式指定 dtype。在 conversion section 中解释了转换为这些 dtype 的简单方法。
在算术和比较运算中传播#
总的来说,缺失值在涉及 NA 的运算中会 传播。当其中一个操作数为未知时,运算结果也未知。
例如,NA 在算术运算中的传播方式与 np.nan 类似:
当运算结果已知时,即使其中一个操作数为 NA,也有一些特殊情况。
在相等性和比较运算中,NA 也会传播。这与 np.nan 的行为不同,后者与 np.nan 的比较总是返回 False。
备注
对这个基本传播规则的一个例外是*规约*(例如均值或最小值),pandas 默认会跳过缺失值。更多信息请参见 calculation section 。
逻辑运算#
For logical operations, NA follows the rules of the
three-valued logic (or
Kleene logic, similarly to R, SQL and Julia). This logic means to only
propagate missing values when it is logically required.
例如,对于逻辑“或”运算(|),如果其中一个操作数为 True,我们已经知道结果将是 True,无论另一个值是什么(因此无论缺失值是 True 还是 False)。在这种情况下,NA 不会传播:
另一方面,如果其中一个操作数为 False,则结果取决于另一个操作数的值。因此,在这种情况下,NA 会传播:
逻辑“与”运算(&)的行为可以通过类似的逻辑推导出来(现在如果其中一个操作数已经是 False,NA 将不会传播):
NA 在布尔上下文中#
由于 NA 的实际值是未知的,因此将 NA 转换为布尔值是模棱两可的。
这也意味着 NA 不能用于需要将其求值为布尔值的上下文,例如 if condition: ...,其中 condition 可能是 NA 。在这种情况下,可以使用 isna() 来检查 NA ,或者可以避免 condition 为 NA 的情况,例如提前填充缺失值。
当在 if 语句中使用 Series 或 DataFrame 对象时,会出现类似的情况,请参阅 在 pandas 中使用 if/truth 语句 。
NumPy ufuncs#
pandas.NA 实现 NumPy 的 __array_ufunc__ 协议。大多数 ufuncs 都支持 NA,并且通常返回 NA:
警告
目前,涉及 ndarray 和 NA 的 ufuncs 将返回一个填充了 NA 值的 object-dtype。
返回类型这里可能会在未来更改为返回不同的数组类型。
有关 ufuncs 的更多信息,请参阅 DataFrame 与 NumPy 函数的互操作性 。
转换#
If you have a DataFrame or Series using np.nan,
Series.convert_dtypes() and DataFrame.convert_dtypes()
in DataFrame that can convert data to use the data types that use NA
such as Int64Dtype or ArrowDtype. This is especially helpful after reading
in data sets from IO methods where data types were inferred.
在此示例中,虽然所有列的 dtype 都已更改,但我们仅显示前 10 列的结果。
插入缺失数据#
您可以通过简单地赋值给 Series 或 DataFrame 来插入缺失值。使用的缺失值标记将根据 dtype 选择。
对于 object 类型,pandas 将使用给定的值:
缺失数据的计算#
pandas 对象之间的算术运算会传播缺失值。
data structure overview 中讨论的(并在此处 here 和此处 here 列出的)描述性统计和计算方法都考虑了缺失数据。
在对数据求和时,NA 值或空数据将被视作零。
在取乘积时,NA 值或空数据将被视作 1。
累积方法,如 cumsum() 和 cumprod() ,默认情况下会忽略 NA 值,但会在结果中保留它们。此行为可以通过 skipna 进行更改。
删除缺失数据#
dropna() 删除包含缺失数据的行或列。
填充缺失数据#
按值填充#
fillna() 使用非 NA 数据替换 NA 值。
用标量值替换 NA
前向或后向填充空缺
限制填充的 NA 值数量
NA 值可以用来自 Series 或 DataFrame 的相应值替换,其中原始对象和填充对象之间的索引和列对齐。
备注
DataFrame.where() 也可以用来填充 NA 值。结果与上面相同。
插值#
DataFrame.interpolate() 和 Series.interpolate() 使用各种插值方法填充 NA 值。
Interpolation relative to a Timestamp in the DatetimeIndex
is available by setting method="time"
对于浮点索引,请使用 method='values':
如果您安装了 scipy,您可以将 1-D 插值例程的名称传递给 method,如 scipy 插值文档_和参考指南_中所述。适当的插值方法将取决于数据类型。
小技巧
如果您处理的是以递增速率增长的时间序列,请使用 method='barycentric'。
如果您有近似累积分布函数的数值,请使用 method='pchip'。
为了平滑绘图的目标,使用 method='akima' 来填充缺失值。
通过多项式或样条曲线近似进行插值时,还必须指定近似的次数或阶数:
比较几种方法。
使用 Series.reindex() 从不断扩展的数据中插值新观测值。
插值限制#
interpolate() 接受 limit 关键字参数,用于限制自上次有效观测值以来连续填充的 NaN 值的数量。
默认情况下,NaN 值以 forward 方向填充。使用 limit_direction 参数从 backward 或 both 方向填充。
默认情况下,无论 NaN 值是被现有有效值包围还是位于现有有效值之外,都会被填充。limit_area 参数将填充限制在内部或外部值。
替换值#
Series.replace() 和 DataFrame.replace() 的用法类似于 Series.fillna() 和 DataFrame.fillna() ,可用于替换或插入缺失值。
可以通过传递列表来替换多个值。
使用映射字典进行替换。
正则表达式替换#
备注
以 r 字符为前缀的 Python 字符串,如 r'hello world',是 “raw” strings 。它们在反斜杠方面的语义与没有此前缀的字符串不同。原始字符串中的反斜杠将被解释为转义的反斜杠,例如 r'\' == '\\'。
将 ‘.’ 替换为 NaN
使用正则表达式将 ‘.’ 替换为 NaN,并移除周围的空格
使用正则表达式列表进行替换。
在映射字典中使用正则表达式进行替换。
传递使用 regex 关键字的正则表达式嵌套字典。
传递将匹配项替换为标量的正则表达式列表。
所有正则表达式示例也可以通过 to_replace 参数作为 regex 参数传递。在这种情况下,必须显式地通过名称传递 value 参数,或者 regex 必须是嵌套字典。
备注
来自 re.compile 的正则表达式对象也是有效的输入。