数据清洗是指修复和组织混乱数据的过程。Pandas 提供了广泛的工具和函数来帮助我们有效地清洗和预处理数据。
数据清洗通常包括
- 删除不相关的列。
- 将列名重命名为有意义的名称。
- 使数据值保持一致。
- 替换或填充缺失值。
删除包含缺失值的行
在 Pandas 中,我们可以使用 `dropna()` 函数删除包含缺失值的行。例如,
import pandas as pd
# define a dictionary with sample data which includes some missing values
data = {
'A': [1, 2, 3, None, 5],
'B': [None, 2, 3, 4, 5],
'C': [1, 2, None, None, 5]
}
df = pd.DataFrame(data)
print("Original Data:\n",df)
print()
# use dropna() to remove rows with any missing values
df_cleaned = df.dropna()
print("Cleaned Data:\n",df_cleaned)
输出
Original Data: A B C 0 1.0 NaN 1.0 1 2.0 2.0 2.0 2 3.0 3.0 NaN 3 NaN 4.0 NaN 4 5.0 5.0 5.0 Cleaned Data: A B C 1 2.0 2.0 2.0 4 5.0 5.0 5.0
这里,我们使用了 `dropna()` 方法来删除任何缺失值的行。生成的 DataFrame `df_cleaned` 将只包含没有缺失值的行。
填充缺失值
要填充 Pandas 中的缺失值,我们使用 `fillna()` 函数。例如,
import pandas as pd
# define a dictionary with sample data which includes some missing values
data = {
'A': [1, 2, 3, None, 5],
'B': [None, 2, 3, 4, 5],
'C': [1, 2, None, None, 5]
}
df = pd.DataFrame(data)
print("Original Data:\n", df)
# filling NaN values with 0
df.fillna(0, inplace=True)
print("\nData after filling NaN with 0:\n", df)
输出
Original Data: A B C 0 1.0 NaN 1.0 1 2.0 2.0 2.0 2 3.0 3.0 NaN 3 NaN 4.0 NaN 4 5.0 5.0 5.0 Data after filling NaN with 0: A B C 0 1.0 0.0 1.0 1 2.0 2.0 2.0 2 3.0 3.0 0.0 3 0.0 4.0 0.0 4 5.0 5.0 5.0
这里,我们使用 `data.fillna()` 将每列的缺失值 (NaN
) 填充为 **0**。
注意:这里的 `inplace=True` 参数意味着该操作将直接修改 DataFrame,而不是返回一个修改后的新 DataFrame。
使用聚合函数填充缺失值
除了用 **0** 填充外,我们还可以使用聚合函数来填充缺失值。
让我们看一个用每列的平均值填充缺失值的例子。
import pandas as pd
# define a dictionary with sample data which includes some missing values
data = {
'A': [1, 2, 3, None, 5],
'B': [None, 2, 3, 4, 5],
'C': [1, 2, None, None, 5]
}
df = pd.DataFrame(data)
print("Original Data:\n", df)
# filling NaN values with the mean of each column
df.fillna(df.mean(), inplace=True)
print("\nData after filling NaN with mean:\n", df)
输出
Original Data: A B C 0 1.0 NaN 1.0 1 2.0 2.0 2.0 2 3.0 3.0 NaN 3 NaN 4.0 NaN 4 5.0 5.0 5.0 Data after filling NaN with mean: A B C 0 1.00 3.5 1.000000 1 2.00 2.0 2.000000 2 3.00 3.0 2.666667 3 2.75 4.0 2.666667 4 5.00 5.0 5.000000
这里,`df.mean()` 计算每列的平均值,然后 `fillna()` 方法用相应的平均值替换每列中的 `NaN` 值。
处理重复值
在 Pandas 中,要处理重复行,我们可以使用 `duplicated()` 和 `drop_duplicates()` 函数。
- `duplicated()` - 用于检查重复项
- `drop_duplicates()` - 删除重复行
import pandas as pd
# sample data
data = {
'A': [1, 2, 2, 3, 3, 4],
'B': [5, 6, 6, 7, 8, 8]
}
df = pd.DataFrame(data)
print("Original DataFrame:\n", df.to_string(index=False))
# detect duplicates
print("\nDuplicate Rows:\n", df[df.duplicated()].to_string(index=False))
# remove duplicates based on column 'A'
df.drop_duplicates(subset=['A'], keep='first', inplace=True)
print("\nDataFrame after removing duplicates based on column 'A':\n", df.to_string(index=False))
输出
Original DataFrame: A B 1 5 2 6 2 6 3 7 3 8 4 8 Duplicate Rows: A B 2 6 DataFrame after removing duplicates based on column 'A': A B 1 5 2 6 3 7 4 8
在这里,
- `df[df.duplicated()]` 生成一个布尔 Series 来识别重复行。
- `df.drop_duplicates(subset=['A'], keep='first', inplace=True)` 根据列 `A` 删除重复项,直接在原始 DataFrame 中保留每个重复项的第一次出现。
将列名重命名为有意义的名称
要将 Pandas 中的列名重命名为更具意义的名称,我们可以使用 `rename()` 函数。例如,
import pandas as pd
# sample data
data = {
'A': [25, 30, 35],
'B': ['John', 'Doe', 'Smith'],
'C': [50000, 60000, 70000]
}
df = pd.DataFrame(data)
# rename columns
df.rename(columns={'A': 'Age', 'B': 'Name', 'C': 'Salary'}, inplace=True)
print(df.to_string(index=False))
输出
Age Name Salary 25 John 50000 30 Doe 60000 35 Smith 70000
这里,df 的列已分别从 `A`、`B` 和 `C` 重命名为更有意义的名称 `Age`、`Name` 和 `Salary`。