介绍
欢迎来到 Pandas 基本数据清理实验。数据清理是任何数据分析或机器学习项目中的关键第一步。真实世界的数据通常是混乱的,包含缺失值、重复条目或不正确的数据类型。使用原始、不干净的数据可能导致分析不准确和结论不可靠。
Pandas 是一个强大的 Python 库,提供了高性能、易于使用的数据结构和数据分析工具。它是 Python 中数据清理和操作的首选工具。
在本实验中,你将学习使用 Pandas 清理数据集的基本技术。你将练习:
- 使用
dropna()删除带有缺失值的行。 - 使用
fillna()填充缺失值。 - 使用
drop_duplicates()删除重复行。 - 使用
rename()重命名列。 - 使用
astype()转换列数据类型。
在本实验结束时,你将对 Pandas 中的基本数据清理工作流程有扎实的理解。
使用 dropna 方法删除行
在此步骤中,你将学习如何通过删除包含 null 值的行来处理缺失数据。在 Pandas 中,缺失数据用 NaN (Not a Number) 表示。处理 NaN 值最简单的策略之一是删除包含它们的行或列。
dropna() 方法可以让你轻松地做到这一点。默认情况下,它会删除包含至少一个 NaN 值的任何行。
首先,让我们运行初始脚本来查看我们的起始 DataFrame。设置脚本已在 ~/project 目录中创建了一个名为 main.py 的文件。
在 WebIDE 中打开一个终端并运行以下命令:
python3 main.py
你应该会看到原始 DataFrame,其中 age 和 city 列包含 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+S 或 Cmd+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 的列。让我们将其重命名为一个更简单的小写名称:salary。rename() 方法非常适合此操作。你将一个字典传递给 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 的数据操作。



