Pandas 数据清洗

数据清洗是指修复和组织混乱数据的过程。Pandas 提供了广泛的工具和函数来帮助我们有效地清洗和预处理数据。

数据清洗通常包括

  1. 删除不相关的列。
  2. 将列名重命名为有意义的名称。
  3. 使数据值保持一致。
  4. 替换或填充缺失值。

删除包含缺失值的行

在 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

在这里,

  1. `df[df.duplicated()]` 生成一个布尔 Series 来识别重复行。
  2. `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`。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战