Python Pandas - 缺失数据的计算
在处理数据时,您经常会遇到缺失值,在 Pandas 中这些值表示为 NaN(Not a Number)。与缺失值进行计算需要格外注意,因为 NaN 值会在大多数算术运算中传播,这可能会改变结果。
Pandas 提供了灵活的方式来在计算过程中管理缺失数据,让您能够控制这些值如何影响结果。在本教程中,我们将学习 Pandas 如何在计算过程中处理缺失数据,包括算术运算、描述性统计和累积运算。
缺失数据的算术运算
在 Pandas 对象之间执行算术运算时,缺失值(NaN)默认会传播。例如,当您将两个包含 NaN 值的 series 相加时,结果中任何一方有缺失值的位置都会是 NaN。
示例
以下示例演示了在两个包含缺失值的 series 对象之间执行算术运算。
import pandas as pd
import numpy as np
# 创建 2 个输入 series 对象
ser1 = pd.Series([1, np.nan, np.nan, 2])
ser2 = pd.Series([2, np.nan, 1, np.nan])
# 显示 series
print("输入 Series 1:\n",ser1)
print("\n输入 Series 2:\n",ser2)
# 将两个包含 NaN 值的 series 相加
result = ser1 + ser2
print('\n两个 series 相加后的结果:\n',result)
以上代码的输出如下 −
Input Series 1: 0 1.0 1 NaN 2 NaN 3 2.0 dtype: float64 Input Series 2: 0 2.0 1 NaN 2 1.0 3 NaN dtype: float64 Result After adding Two series: 0 3.0 1 NaN 2 NaN 3 NaN dtype: float64
描述性统计中的缺失数据处理
Pandas 库提供了多种方法来计算描述性统计,例如求和、计算乘积,或查找累积和或乘积。这些方法都设计为能够高效处理缺失数据。
示例:包含缺失值的求和
在对包含缺失值的数据进行求和时,NaN 值会被排除。这让您即使在部分数据缺失的情况下也能计算出有意义的总数。
以下示例使用 sum() 函数对 DataFrame 的一列执行求和操作。默认情况下,求和操作会跳过 NaN 值。
import pandas as pd
import numpy as np
# 创建示例 DataFrame
data = {'A': [np.nan, 2, np.nan, 4], 'B': [5, 6, 7, 8]}
df = pd.DataFrame(data)
# 显示输入 DataFrame
print("输入 DataFrame:\n", df)
# 对包含 NaN 值的列求和
result = df['A'].sum()
print('\n对列的值求和后的结果:\n',result)
以上代码的输出如下 −
Input DataFrame:
| A | B | |
|---|---|---|
| 0 | NaN | 5 |
| 1 | 2.0 | 6 |
| 2 | NaN | 7 |
| 3 | 4.0 | 8 |
示例:包含缺失值的乘积计算
类似于求和,在计算包含缺失数据(NaN)的值的乘积时,NaN 被视为 1。这确保了缺失值不会改变最终的乘积。
以下示例使用 pandas 的 df.prod() 函数计算 pandas 对象的乘积。
import pandas as pd
import numpy as np
# 创建示例 DataFrame
data = {'A': [np.nan, 2, np.nan, 4], 'B': [5, 6, np.nan, np.nan]}
df = pd.DataFrame(data)
# 显示输入 DataFrame
print("输入 DataFrame:\n", df)
# 包含 NaN 值的乘积
result = df.prod()
print('\nDataFrame 值乘积后的结果:\n',result)
以上代码的输出如下 −
Input DataFrame:
| A | B | |
|---|---|---|
| 0 | NaN | 5.0 |
| 1 | 2.0 | 6.0 |
| 2 | NaN | NaN |
| 3 | 4.0 | NaN |
含缺失数据的累积操作
Pandas 提供了像 cumsum() 和 cumprod() 这样的累积方法来生成运行总和或乘积。默认情况下,这些方法会忽略缺失值,但会在输出中保留它们。如果您想在计算中包含缺失数据,可以将 skipna 参数设置为 False。
示例:含缺失值的累积求和
以下示例演示了使用 df.cumsum() 方法计算含缺失值的 DataFrame 的累积求和。
import pandas as pd
import numpy as np
# 创建示例 DataFrame
data = {'A': [np.nan, 2, np.nan, 4], 'B': [5, 6, np.nan, np.nan]}
df = pd.DataFrame(data)
# 显示输入 DataFrame
print("Input DataFrame:\n", df)
# 通过忽略 NaN 计算累积求和
print('Cumulative sum by ignoring NaN:\n',df.cumsum())
以上代码的输出如下 −
Input DataFrame:
| A | B | |
|---|---|---|
| 0 | NaN | 5.0 |
| 1 | 2.0 | 6.0 |
| 2 | NaN | NaN |
| 3 | 4.0 | NaN |
| A | B | |
|---|---|---|
| 0 | NaN | 5.0 |
| 1 | 2.0 | 11.0 |
| 2 | NaN | NaN |
| 3 | 6.0 | NaN |
从以上输出可以观察到,缺失值被跳过,累积求和仅针对可用值进行计算。
示例:在累积求和中包含 NaN
此示例展示了通过设置 skipna=False 使用 df.cumsum() 方法在累积求和中包含缺失值的方式。
import pandas as pd
import numpy as np
# 创建示例 DataFrame
data = {'A': [np.nan, 2, np.nan, 4], 'B': [5, 6, np.nan, np.nan]}
df = pd.DataFrame(data)
# 显示输入 DataFrame
print("Input DataFrame:\n", df)
# 通过保留 NaN 计算累积求和
print('Cumulative sum by including NaN:\n', df.cumsum(skipna=False))
以上代码的输出如下 −
Input DataFrame:
| A | B | |
|---|---|---|
| 0 | NaN | 5.0 |
| 1 | 2.0 | 6.0 |
| 2 | NaN | NaN |
| 3 | 4.0 | NaN |
| A | B | |
|---|---|---|
| 0 | NaN | 5.0 |
| 1 | NaN | 11.0 |
| 2 | NaN | NaN |
| 3 | NaN | NaN |
使用 skipna=False 时,一旦遇到 NaN 值,累积求和就会停止,此后所有值都会变为 NaN。