Pandas 基本数据清理

PandasBeginner
立即练习

介绍

欢迎来到 Pandas 基本数据清理实验。数据清理是任何数据分析或机器学习项目中的关键第一步。真实世界的数据通常是混乱的,包含缺失值、重复条目或不正确的数据类型。使用原始、不干净的数据可能导致分析不准确和结论不可靠。

Pandas 是一个强大的 Python 库,提供了高性能、易于使用的数据结构和数据分析工具。它是 Python 中数据清理和操作的首选工具。

在本实验中,你将学习使用 Pandas 清理数据集的基本技术。你将练习:

  • 使用 dropna() 删除带有缺失值的行。
  • 使用 fillna() 填充缺失值。
  • 使用 drop_duplicates() 删除重复行。
  • 使用 rename() 重命名列。
  • 使用 astype() 转换列数据类型。

在本实验结束时,你将对 Pandas 中的基本数据清理工作流程有扎实的理解。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 88%。获得了学习者 100% 的好评率。

使用 dropna 方法删除行

在此步骤中,你将学习如何通过删除包含 null 值的行来处理缺失数据。在 Pandas 中,缺失数据用 NaN (Not a Number) 表示。处理 NaN 值最简单的策略之一是删除包含它们的行或列。

dropna() 方法可以让你轻松地做到这一点。默认情况下,它会删除包含至少一个 NaN 值的任何行。

首先,让我们运行初始脚本来查看我们的起始 DataFrame。设置脚本已在 ~/project 目录中创建了一个名为 main.py 的文件。

在 WebIDE 中打开一个终端并运行以下命令:

python3 main.py

你应该会看到原始 DataFrame,其中 agecity 列包含 NaN 值。

Original DataFrame:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva   NaN       Boston         90000
6    Frank  45.0          NaN        100000

Original DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column         Non-Null Count  Dtype
---  ------         --------------  -----
 0   name           7 non-null      object
 1   age            6 non-null      float64
 2   city           6 non-null      object
 3   SALARY_IN_USD  7 non-null      object
dtypes: float64(1), object(3)
memory usage: 352.0+ bytes

现在,让我们使用 dropna() 来看看它是如何工作的。从左侧面板的文件浏览器中打开 main.py 文件。将以下代码添加到文件末尾。此代码将创建一个新的 DataFrame df_dropped,其中已删除包含 NaN 的行,并打印它。我们尚未修改原始的 df,因此可以在后续步骤中探索其他方法。

## Add this to the end of main.py

print("\nDataFrame after dropping rows with any missing values:")
df_dropped = df.dropna()
print(df_dropped)

保存文件(Ctrl+SCmd+S),然后从终端再次运行它:

python3 main.py

输出现在将包含一个新部分,显示在包含 NaN 值的行(Eva 和 Frank 的行)被删除后的 DataFrame。

## ... (previous output) ...

DataFrame after dropping rows with any missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000

使用 fillna 填充缺失值

在此步骤中,你将学习处理缺失数据的另一种方法:使用 fillna() 方法将缺失值填充为特定值。删除带有缺失数据的行有时会导致大量数据丢失,尤其是在许多行都包含缺失值的情况下。填充它们通常是更好的选择。

你可以用一个常量(如 0 或 "Unknown")来填充 NaN 值,或者用一个计算值(如该列的平均值或中位数)来填充。

让我们修改 main.py 文件。我们不再仅仅打印已删除缺失值的 DataFrame,而是将通过填充缺失值来清理我们的主 DataFrame df。我们将用现有年龄的平均值来填充缺失的 age,用字符串 'Unknown' 来填充缺失的 city

删除你在上一步添加的 dropna() 代码,并用以下代码替换它。我们使用 inplace=True 来直接修改 DataFrame。

## Replace the dropna() code with this at the end of main.py

## Calculate the mean of the 'age' column
mean_age = df['age'].mean()

## Fill missing values using the recommended approach to avoid FutureWarnings
df.fillna({'age': mean_age, 'city': 'Unknown'}, inplace=True)

print("\nDataFrame after filling missing values:")
print(df)

inplace=True 参数会就地修改 DataFrame,这意味着你不需要将结果重新赋值给一个变量(例如 df = df.fillna(...))。

保存文件,然后从终端运行它:

python3 main.py

你将看到 NaN 值已被替换。Eva 的年龄现在是其他年龄的平均值,而 Frank 的城市是 'Unknown'。

## ... (original DataFrame output) ...

DataFrame after filling missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

注意:平均年龄是 (25+30+35+40+25+45)/6 = 33.33...。Pandas 会用这个值来填充 NaN。上面的输出为了简化显示了 35.0,你实际输出的 Eva 的年龄将是计算出的平均值。

使用 drop_duplicates 删除重复行

在此步骤中,你将学习如何从 DataFrame 中删除重复的行。重复的数据会扭曲分析结果并导致不正确的结论。drop_duplicates() 方法有助于识别和删除它们。

在我们原始的数据集中,“Alice”的行出现了两次,信息完全相同。现在我们已经处理了缺失值,我们的下一个清理任务是删除这个重复的条目。

默认情况下,如果一个行的所有列值都与其他行的值相同,drop_duplicates() 会将该行视为重复行。

将以下代码添加到你的 main.py 脚本末尾。我们将继续使用 inplace=True 来修改我们的 DataFrame。

## Add this to the end of main.py

df.drop_duplicates(inplace=True)

print("\nDataFrame after dropping duplicates:")
print(df)

保存文件并在终端中执行它:

python3 main.py

输出现在将显示一个只有 6 行的 DataFrame,因为其中一个“Alice”的行已被删除。

## ... (previous output) ...

DataFrame after dropping duplicates:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

请注意,索引 4 现在缺失了,这对应于被删除的重复行。DataFrame 现在有 6 行唯一数据。

使用 rename 方法重命名列

在此步骤中,你将学习如何重命名列。一致且清晰的列名对于代码的可读性和可维护性至关重要。使用一致的命名约定是一种常见做法,例如全部小写并用下划线分隔。

我们的 DataFrame 中有一个名为 SALARY_IN_USD 的列。让我们将其重命名为一个更简单的小写名称:salaryrename() 方法非常适合此操作。你将一个字典传递给 columns 参数,其中键是旧名称,值是新名称。

将以下代码添加到你的 main.py 脚本末尾:

## Add this to the end of main.py

df.rename(columns={'SALARY_IN_USD': 'salary'}, inplace=True)

print("\nDataFrame after renaming columns:")
print(df)

保存文件并在终端中运行它:

python3 main.py

你将看到 SALARY_IN_USD 列已成功重命名为 salary

## ... (previous output) ...

DataFrame after renaming columns:
      name   age         city   salary
0    Alice  25.0     New York    50000
1      Bob  30.0  Los Angeles    60000
2  Charlie  35.0     New York    70000
3    David  40.0      Chicago    80000
5      Eva  33.3       Boston    90000
6    Frank  45.0      Unknown   100000

这个简单的更改使得列名更容易输入,并遵循了常见的 Python 风格指南。

使用 astype 转换列类型

在最后这个步骤中,你将学习如何转换列的数据类型。正确的数据类型对于执行计算和内存效率至关重要。

如果你查看最初的 df.info() 输出,你会注意到 SALARY_IN_USD 列的 Dtype 是 object,这意味着它将数字存储为字符串。我们无法对字符串执行数学运算(例如计算平均工资)。我们需要将此列转换为数字类型,例如 int(整数)。

astype() 方法用于此目的。让我们将新的 salary 列转换为 int 类型。

将以下代码添加到 main.py 的末尾。我们还将再次打印 DataFrame 的 info 以确认更改。

## Add this to the end of main.py

df['salary'] = df['salary'].astype(int)

print("\nDataFrame after converting data types:")
print(df)

print("\nFinal DataFrame Info:")
df.info()

保存文件并最后一次运行它:

python3 main.py

最终输出将显示清理后的 DataFrame 及其新信息。仔细查看 info 输出中 salary 列的 Dtype。它现在应该是 int64,而不是 object

## ... (previous output) ...

DataFrame after converting data types:
      name   age         city  salary
0    Alice  25.0     New York   50000
1      Bob  30.0  Los Angeles   60000
2  Charlie  35.0     New York   70000
3    David  40.0      Chicago   80000
5      Eva  33.3       Boston   90000
6    Frank  45.0      Unknown  100000

Final DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   name    6 non-null      object
 1   age     6 non-null      float64
 2   city    6 non-null      object
 3   salary  6 non-null      int64
dtypes: float64(1), int64(1), object(2)
memory usage: 240.0+ bytes

现在 salary 列是整数类型,你可以执行诸如 df['salary'].mean() 之类的计算了。

总结

恭喜你完成了 Pandas 基本数据清理实验!你已成功将一个混乱、原始的数据集转换为了一个干净、可供分析的格式。

在此实验中,你学习并实践了 Pandas 中几种关键的数据清理技术:

  • 处理缺失值: 你了解了如何使用 dropna() 删除带有 NaN 的行,以及如何使用 fillna() 用有意义的数据填充它们。
  • 删除重复项: 你使用 drop_duplicates() 从数据集中删除了冗余的行。
  • 重命名列: 你学习了如何使用 rename() 方法使列名更加一致和易读。
  • 转换数据类型: 你使用 astype() 将列的数据类型更改为正确的格式,以便进行后续分析。

这些基本技能是任何严肃数据工作的基石。掌握它们将使你能够自信地应对现实世界的数据挑战。继续练习这些技术,以熟练掌握 Pandas 的数据操作。