Python Pandas - 插值处理缺失值



插值是 Pandas 中一种强大的技术,用于处理数据集中的缺失值。此技术根据数据集的其他数据点估算缺失值。Pandas 为 DataFrame 和 Series 对象都提供了 **interpolate()** 方法,可以使用各种插值方法填充缺失值。

在本教程中,我们将学习 Pandas 中的 **interpolate()** 方法,使用不同的插值方法填充时间序列数据、数值数据等中的缺失值。

基本插值

DataFrame 和 Series 对象的 Pandas **interpolate()** 方法用于使用不同的插值策略填充缺失值。默认情况下,Pandas 自动使用线性插值作为默认方法。

示例

这是一个调用 **interpolate()** 方法填充缺失值的简单示例。

import numpy as np
import pandas as pd

df = pd.DataFrame({"A": [1.1, np.nan, 3.5, np.nan, np.nan, np.nan, 6.2, 7.9],
"B": [0.25, np.nan, np.nan, 4.7, 10, 14.7, 1.3, 9.2],
})

print("Original DataFrame:")
print(df)

# Using the  interpolate() method
result = df.interpolate()
print("\nResultant DataFrame after applying the interpolation:")
print(result)

以下是上述代码的输出 -

Original DataFrame:
AB
01.10.25
1NaNNaN
23.5NaN
3NaN4.70
4NaN10.00
5NaN14.70
66.21.30
77.99.20
Resultant DataFrame after applying the interpolation:
AB
01.1000.250000
12.3001.733333
23.5003.216667
34.1754.700000
44.85010.000000
55.52514.700000
66.2001.300000
77.9009.200000

不同的插值方法

Pandas 支持多种插值方法,包括线性、多项式、pchip、akima、spline 等。这些方法为根据数据的性质填充缺失值提供了灵活性。

示例

以下示例演示了使用 **interpolate()** 方法和 **barycentric** 插值技术。

import numpy as np
import pandas as pd

df = pd.DataFrame({"A": [1.1, np.nan, 3.5, np.nan, np.nan, np.nan, 6.2, 7.9],
"B": [0.25, np.nan, np.nan, 4.7, 10, 14.7, 1.3, 9.2],
})

print("Original DataFrame:")
print(df)

# Applying the interpolate() with Barycentric method
result = df.interpolate(method='barycentric')

print("\nResultant DataFrame after applying the interpolation:")
print(result)

以下是上述代码的输出 -

Original DataFrame:
iAB
01.10.25
1NaNNaN
23.5NaN
3NaN4.70
4NaN10.00
5NaN14.70
66.21.30
77.99.20
Resultant DataFrame after applying the interpolation:
AB
01.1000000.250000
12.59642957.242857
23.50000024.940476
34.0614294.700000
44.53142910.000000
55.16071414.700000
66.2000001.300000
77.9000009.200000

处理插值中的限制

默认情况下,Pandas 插值填充所有缺失值,但是您可以使用 **interpolate()** 方法的 **limit** 参数限制填充多少个连续的 NaN 值。

示例

以下示例演示了通过使用 **interpolate()** 方法的 **limit** 参数限制连续填充来填充 Pandas DataFrame 的缺失值。

import numpy as np
import pandas as pd

df = pd.DataFrame({"A": [1.1, np.nan, 3.5, np.nan, np.nan, np.nan, 6.2, 7.9],
"B": [0.25, np.nan, np.nan, 4.7, 10, 14.7, 1.3, 9.2],
})

print("Original DataFrame:")
print(df)

# Applying the interpolate() with limit
result = df.interpolate(method='spline', order=2, limit=1)

print("\nResultant DataFrame after applying the interpolation:")
print(result)

以下是上述代码的输出 -

Original DataFrame:
iAB
01.10.25
1NaNNaN
23.5NaN
3NaN4.70
4NaN10.00
5NaN14.70
66.21.30
77.99.20
Resultant DataFrame after applying the interpolation:
iAB
01.1000000.250000
12.231383-1.202052
23.500000NaN
34.1115294.700000
4NaN10.000000
5NaN14.700000
66.2000001.300000
77.9000009.200000

时间序列数据的插值

插值也可以应用于 Pandas 时间序列数据。在填充随时间推移缺失数据点的间隙时,这很有用。

示例

示例语句 -

import numpy as np
import pandas as pd

indx = pd.date_range("2024-01-01", periods=10, freq="D")
data = np.random.default_rng(2).integers(0, 10, 10).astype(np.float64)
s = pd.Series(data, index=indx)
s.iloc[[1, 2, 5, 6, 9]] = np.nan

print("Original Series:")
print(s)

result = s.interpolate(method="time")

print("\nResultant Time Series after applying the interpolation:")
print(result)

以下是上述代码的输出 -

Original Series:
DateValue
2024-01-018.0
2024-01-02NaN
2024-01-03NaN
2024-01-042.0
2024-01-054.0
2024-01-06NaN
2024-01-07NaN
2024-01-080.0
2024-01-093.0
2024-01-10NaN
Resultant Time Series after applying the interpolation:
DateValue
2024-01-018.000000
2024-01-026.000000
2024-01-034.000000
2024-01-042.000000
2024-01-054.000000
2024-01-062.666667
2024-01-071.333333
2024-01-080.000000
2024-01-093.000000
2024-01-103.000000
广告