1. 创建包含缺失值的DataFrame
首先,需要创建一个包含缺失值的DataFrame。
import pandas as pd
import numpy as np
# 创建一个包含缺失值的DataFrame
data = {
'Name': ['Alice', 'Bob', np.nan, 'David'], 'Age': [24, np.nan, 22, 32], 'City': ['New York', 'Los Angeles', np.nan, np.nan], 'Score': [85, np.nan, np.nan, 92]}
df = pd.DataFrame(data)
print(df)
输出:
Name Age City Score0 Alice 24.0 New York 85.0
1 Bob NaN Los Angeles NaN
2 NaN 22.0 NaN NaN
3 David 32.0 NaN 92.0
2. 使用函数填充缺失值
可以定义一个函数来处理缺失值,并使用apply
方法将该函数应用到DataFrame的列或行。
2.1 定义填充函数
假设希望将缺失的Name
列填充为’Unknown’,将缺失的Age
列填充为该列的平均值,将缺失的City
列填充为’Unknown’,将缺失的Score
列填充为该列的中位数。
def fill_missing_values(column):
if column.name == 'Name' or column.name == 'City': return column.fillna('Unknown') elif column.name == 'Age': return column.fillna(column.mean()) elif column.name == 'Score': return column.fillna(column.median()) return column```
#### 2.2 应用填充函数
使用`apply`方法将填充函数应用到DataFrame的每一列。
```python
df_filled = df.apply(fill_missing_values, axis=0)
print(df_filled)
输出:
Name Age City Score0 Alice 24.0 New York 85.0
1 Bob 28.0 Los Angeles 88.5
2 Unknown 22.0 Unknown 88.5
3 David 32.0 Unknown 92.0
3. 使用lambda
函数进行填充
除了定义自定义函数,还可以使用lambda
函数进行简单的数据填充。
# 使用lambda函数填充缺失值
df_filled_lambda = df.apply(lambda x: x.fillna('Unknown') if x.name in ['Name', 'City'] else x.fillna(x.mean()) if x.name == 'Age' else x.fillna(x.median()) if x.name == 'Score' else x, axis=0)
print(df_filled_lambda)
输出:
Name Age City Score0 Alice 24.0 New York 85.0
1 Bob 28.0 Los Angeles 88.5
2 Unknown 22.0 Unknown 88.5
3 David 32.0 Unknown 92.0
4. 使用fillna
方法结合函数
还可以使用fillna
方法结合函数来进行数据填充。
# 使用fillna方法结合函数填充缺失值
df_filled_fillna = df.copy()
df_filled_fillna['Name'] = df_filled_fillna['Name'].fillna('Unknown')
df_filled_fillna['City'] = df_filled_fillna['City'].fillna('Unknown')
df_filled_fillna['Age'] = df_filled_fillna['Age'].fillna(df_filled_fillna['Age'].mean())
df_filled_fillna['Score'] = df_filled_fillna['Score'].fillna(df_filled_fillna['Score'].median())
print(df_filled_fillna)
输出:
Name Age City Score0 Alice 24.0 New York 85.0
1 Bob 28.0 Los Angeles 88.5
2 Unknown 22.0 Unknown 88.5
3 David 32.0 Unknown 92.0