想要查看本系列的其他文章请到作者主页中。
学习提示:在有别的编程基础之上,学习Python很简单,只是语法不同,所以有很多新的语法记不住也没关系,不用专门耗时间死记,实战的时候现用现查就行。
下面的介绍中是每个部分最常用的语法,基本能够应付绝大多数的情况,如果希望学习更详细的内容,可以参考每个部分给出的资料链接。
AI闪电战:代码+实战 从Python速通到深度学习|数据处理与分析——Pandas2
4. 数据清洗方法
4.1 处理缺失值(使用dropna
, fillna
等)
内容引入:
在数据分析中,缺失值是一个常见的问题。如果不处理好缺失值,数据分析结果可能会不准确。Pandas 提供了多种方法来处理缺失值,例如删除包含缺失值的行或列,或使用合理的值(如均值或中位数)来填充缺失值。
常用语法:
import pandas as pd
import numpy as np
# 创建包含缺失值的DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', None],
'Age': [25, np.nan, 30, 22],
'Score': [85, 90, np.nan, 88]
}
df = pd.DataFrame(data)
# 使用 dropna 删除包含缺失值的行
df_dropna = df.dropna()
# 使用 fillna 填充缺失值
df_fillna = df.fillna({
'Age': df['Age'].mean(), # 使用年龄的平均值填充
'Score': 0 # 使用 0 填充缺失的分数
})
# 查看结果
print("原始数据:\n", df)
print("\n删除缺失值后的数据:\n", df_dropna)
print("\n填充缺失值后的数据:\n", df_fillna)
要点总结:
dropna()
方法用于删除包含缺失值的行或列。参数axis=0
删除行,axis=1
删除列。fillna()
方法用于填充缺失值,可以通过字典为不同列指定不同的填充值,或使用全局填充值。- 对于数值型数据,可以使用均值、0 或中位数等合理的方式进行填充。
练习:
- 创建一个包含缺失值的DataFrame,删除所有包含缺失值的行,并尝试用均值或0填充缺失值。
答案:
import pandas as pd
import numpy as np
# 创建包含缺失值的DataFrame
data = {
'Product': ['Apple', 'Banana', None, 'Orange'],
'Price': [1.2, np.nan, 0.8, None],
'Quantity': [10, 5, None, 7]
}
df = pd.DataFrame(data)
# 删除包含缺失值的行
df_cleaned = df.dropna()
# 使用 0 和均值填充缺失值
df_filled = df.fillna({
'Price': df['Price'].mean(),
'Quantity': 0
})
print("删除缺失值后的数据:\n", df_cleaned)
print("\n填充缺失值后的数据:\n", df_filled)
更详细的知识点学习链接:
4.2 重复数据处理(使用duplicated
, drop_duplicates
等)
内容引入:
重复的数据会影响分析结果,尤其在数据清洗和准备阶段。Pandas 提供了检测和删除重复行的方法,帮助保持数据的唯一性和完整性。
常用语法:
import pandas as pd
# 创建包含重复数据的DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'Bob'],
'Age': [25, 30, 25, 30],
'Score': [88.5, 92, 88.5, 92]
}
df = pd.DataFrame(data)
# 使用 duplicated() 检测重复行
duplicates = df.duplicated()
# 使用 drop_duplicates() 删除重复行
df_no_duplicates = df.drop_duplicates()
# 查看结果
print("重复行检测:\n", duplicates)
print("\n删除重复行后的数据:\n", df_no_duplicates)
要点总结:
duplicated()
方法用于检测DataFrame中的重复行,返回一个布尔值Series,表示每一行是否为重复行。drop_duplicates()
方法用于删除DataFrame中的重复行,只保留第一个出现的重复行。- 可以使用
subset
参数来指定哪些列需要用于检查重复数据。
练习:
- 创建一个包含重复行的DataFrame,检测并删除这些重复行。
答案:
import pandas as pd
# 创建包含重复数据的DataFrame
data = {
'City': ['New York', 'Los Angeles', 'Chicago', 'New York'],
'Population': [8419600, 3980400, 2716000, 8419600]
}
df = pd.DataFrame(data)
# 检测重复行
duplicates = df.duplicated()
# 删除重复行
df_cleaned = df.drop_duplicates()
print("重复行检测:\n", duplicates)
print("\n删除重复行后的数据:\n", df_cleaned)
更详细的知识点学习链接:
4.3 数据类型转换(使用astype
等)
内容引入:
在数据分析过程中,我们经常需要对数据类型进行转换。例如,将字符串转换为数值,或将整型转换为浮点型。Pandas 的 astype()
方法可以轻松完成这些转换。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'ID': ['001', '002', '003'],
'Price': ['10.5', '20.0', '15.75']
}
df = pd.DataFrame(data)
# 将 "Price" 列从字符串转换为浮点型
df['Price'] = df['Price'].astype(float)
# 查看转换后的数据类型
print(df.dtypes)
print(df)
要点总结:
astype()
方法用于将一列数据类型转换为另一种数据类型,如int
、float
、str
或datetime
。- 转换之前需确保数据格式正确,否则可能会引发转换错误。
练习:
- 创建一个包含价格和数量的DataFrame,将价格从字符串转换为浮点型,将数量从字符串转换为整型。
答案:
import pandas as pd
# 创建包含字符串形式的价格和数量的DataFrame
data = {
'Item': ['Apple', 'Banana', 'Orange'],
'Price': ['1.25', '0.75', '0.50'],
'Quantity': ['10', '20', '15']
}
df = pd.DataFrame(data)
# 将 Price 转换为浮点型,将 Quantity 转换为整型
df['Price'] = df['Price'].astype(float)
df['Quantity'] = df['Quantity'].astype(int)
print(df.dtypes)
print(df)
更详细的知识点学习链接:
4.4 要点总结
- 处理缺失值:使用
dropna()
删除包含缺失值的行或列,使用fillna()
填充缺失值,可以根据实际需求选择填充值(如均值或中位数)。 - 处理重复数据:使用
duplicated()
检测重复行,使用drop_duplicates()
删除重复行。 - 数据类型转换:使用
astype()
方法将数据类型从一种转换为另一种,确保数据格式正确以避免转换错误。
好的!我们来完善 5. 数据转换技巧 这一部分。每个小节将包含内容引入、常用语法、要点总结、练习与答案,以及更详细的知识点学习链接。所有代码示例都包含独立数据和导入库。
5. 数据转换技巧
5.1 使用apply
, map
, applymap
进行函数应用
内容引入:
在数据分析中,我们经常需要对DataFrame或Series中的数据进行批量转换和处理。Pandas 提供了多个方便的方法,如 apply()
、map()
和 applymap()
,可以用于对数据进行逐行或逐列的操作,甚至是针对单个元素的操作。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Score': [85, 92, 88]
}
df = pd.DataFrame(data)
# 使用 map 对Series中的数据应用函数,将分数转换为百分制
df['Score_Percentage'] = df['Score'].map(lambda x: x / 100)
# 使用 apply 对列应用函数,将名字转为大写
df['Name_Upper'] = df['Name'].apply(lambda x: x.upper())
# 查看结果
print(df)
要点总结:
map()
主要用于对 Series (如DataFrame的一列)中的每个元素进行操作,常用于映射或转换值。apply()
可以对 Series 或 DataFrame 的列或行应用函数。applymap()
用于对 DataFrame 中的每个元素应用函数,适合矩阵式操作。
练习:
- 创建一个包含商品名称和价格的DataFrame,使用
apply()
和map()
分别将名称转换为大写并将价格增加10%。
答案:
import pandas as pd
# 创建示例DataFrame
data = {
'Product': ['Apple', 'Banana', 'Orange'],
'Price': [1.2, 0.8, 1.5]
}
df = pd.DataFrame(data)
# 使用 map 将商品名称转换为大写
df['Product_Upper'] = df['Product'].map(lambda x: x.upper())
# 使用 apply 将价格增加10%
df['Price_Increased'] = df['Price'].apply(lambda x: x * 1.1)
print(df)
更详细的知识点学习链接:
5.2 重命名列名
内容引入:
有时候,我们需要对DataFrame的列名进行重命名,以便更符合数据的含义或标准格式。Pandas 提供了 rename()
方法,可以轻松实现列名或索引的重命名。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'score': [85, 92, 88]
}
df = pd.DataFrame(data)
# 使用 rename 重命名列名
df_renamed = df.rename(columns={'name': 'Name', 'age': 'Age', 'score': 'Score'})
# 查看结果
print(df_renamed)
要点总结:
rename()
方法可以重命名列或索引。通过columns
参数,可以指定需要重命名的列名。inplace=True
可以在原地修改DataFrame,避免返回新的DataFrame。
练习:
- 创建一个包含列名
item
和cost
的DataFrame,将其列名分别修改为Product
和Price
。
答案:
import pandas as pd
# 创建示例DataFrame
data = {
'item': ['Apple', 'Banana', 'Orange'],
'cost': [1.2, 0.8, 1.5]
}
df = pd.DataFrame(data)
# 重命名列名
df_renamed = df.rename(columns={'item': 'Product', 'cost': 'Price'})
print(df_renamed)
更详细的知识点学习链接:
5.3 设置或重置索引
内容引入:
在Pandas中,索引是DataFrame中每行的唯一标识符。我们可以根据需要将某一列设置为索引,或将现有的索引重置为默认数值索引。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'ID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie'],
'Score': [85, 92, 88]
}
df = pd.DataFrame(data)
# 使用 set_index 设置某一列为索引
df_with_index = df.set_index('ID')
# 使用 reset_index 重置索引为默认的数值型索引
df_reset_index = df_with_index.reset_index()
# 查看结果
print("设置索引后的DataFrame:\n", df_with_index)
print("\n重置索引后的DataFrame:\n", df_reset_index)
要点总结:
set_index()
方法可以将某一列设置为索引,使用inplace=True
可以直接在原DataFrame中修改。reset_index()
方法可以将当前的索引重置为默认的数值型索引,使用drop=True
可以丢弃原来的索引。
练习:
- 创建一个包含
Student_ID
和Name
的DataFrame,将Student_ID
设置为索引,随后重置索引。
答案:
import pandas as pd
# 创建示例DataFrame
data = {
'Student_ID': [101, 102, 103],
'Name': ['Alice', 'Bob', 'Charlie']
}
df = pd.DataFrame(data)
# 设置 Student_ID 为索引
df_with_index = df.set_index('Student_ID')
# 重置索引
df_reset_index = df_with_index.reset_index()
print(df_with_index)
print(df_reset_index)
更详细的知识点学习链接:
好的!接下来我们来完善 6. 数据聚合操作 这一部分。每个小节将包含内容引入、常用语法、要点总结、练习与答案,以及更详细的知识点学习链接。所有代码示例都包含独立数据和导入库。
6. 数据聚合操作
6.1 使用groupby
进行分组计算
内容引入:
在数据分析中,数据的分组操作是非常常见的,特别是当我们想要针对不同类别的数据进行汇总、统计时。Pandas 提供了 groupby()
方法,可以根据一个或多个列对数据进行分组,然后对每个分组执行操作。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'Department': ['Sales', 'Sales', 'HR', 'HR', 'Marketing', 'Marketing'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Salary': [50000, 55000, 60000, 58000, 52000, 51000]
}
df = pd.DataFrame(data)
# 按 Department 分组,并计算每个部门的平均薪资
df_grouped = df.groupby('Department')['Salary'].mean()
# 查看结果
print(df_grouped)
要点总结:
groupby()
用于根据一个或多个列进行数据分组。- 分组后可以对每个组执行如
mean()
、sum()
、count()
等常用聚合操作。 - 分组操作返回的是一个分组对象,需要进行后续的聚合操作。
练习:
- 创建一个包含部门和员工工资的DataFrame,按部门分组并计算每个部门的工资总和。
答案:
import pandas as pd
# 创建示例DataFrame
data = {
'Department': ['Sales', 'Sales', 'HR', 'HR', 'Marketing', 'Marketing'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Salary': [50000, 55000, 60000, 58000, 52000, 51000]
}
df = pd.DataFrame(data)
# 按 Department 分组,并计算工资总和
df_grouped = df.groupby('Department')['Salary'].sum()
print(df_grouped)
更详细的知识点学习链接:
6.2 聚合函数(如sum
, mean
, count
等)
内容引入:
聚合操作是指将分组后的数据按照一定的方式进行汇总、统计,如计算总和、平均值、计数等。Pandas 提供了多种常用的聚合函数,帮助我们快速计算分组后的统计量。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'Department': ['Sales', 'Sales', 'HR', 'HR', 'Marketing', 'Marketing'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Salary': [50000, 55000, 60000, 58000, 52000, 51000],
'Bonus': [5000, 7000, 6000, 5500, 4000, 4500]
}
df = pd.DataFrame(data)
# 使用 sum 计算每个部门的总薪资和总奖金
df_grouped = df.groupby('Department').sum()
# 查看结果
print(df_grouped)
要点总结:
sum()
用于计算总和,mean()
用于计算平均值,count()
用于计算非空值的数量。- 聚合函数可以对分组后的多列同时应用。
- 使用
agg()
可以同时应用多个聚合函数,适合复杂的聚合需求。
练习:
- 创建一个包含多个数值列的DataFrame,使用
mean()
和sum()
对不同列进行汇总计算。
答案:
import pandas as pd
# 创建示例DataFrame
data = {
'Department': ['Sales', 'Sales', 'HR', 'HR', 'Marketing', 'Marketing'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Salary': [50000, 55000, 60000, 58000, 52000, 51000],
'Bonus': [5000, 7000, 6000, 5500, 4000, 4500]
}
df = pd.DataFrame(data)
# 计算每个部门的平均薪资和奖金总和
df_grouped = df.groupby('Department').agg({'Salary': 'mean', 'Bonus': 'sum'})
print(df_grouped)
更详细的知识点学习链接:
6.3 使用agg
进行多函数聚合
内容引入:
agg()
方法允许我们在一个分组操作中同时应用多个不同的聚合函数。这使得我们可以对数据进行更加灵活的处理,比如计算同一列的平均值和总和等。
常用语法:
import pandas as pd
# 创建示例DataFrame
data = {
'Department': ['Sales', 'Sales', 'HR', 'HR', 'Marketing', 'Marketing'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Salary': [50000, 55000, 60000, 58000, 52000, 51000],
'Bonus': [5000, 7000, 6000, 5500, 4000, 4500]
}
df = pd.DataFrame(data)
# 使用 agg 同时计算总和、平均值和最大值
df_grouped = df.groupby('Department').agg({
'Salary': ['sum', 'mean', 'max'],
'Bonus': ['sum', 'mean']
})
# 查看结果
print(df_grouped)
要点总结:
agg()
可以对不同的列应用不同的聚合函数,也可以对同一列应用多个函数。- 通过
agg()
,我们可以对数据进行更复杂的聚合操作,返回的结果会有多重索引。 - 适合需要同时进行多种聚合的场景,比如同时计算总和、均值、最大值等。
练习:
- 使用
agg()
同时计算某列的最小值、最大值、均值和计数。
答案:
import pandas as pd
# 创建示例DataFrame
data = {
'Department': ['Sales', 'Sales', 'HR', 'HR', 'Marketing', 'Marketing'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Salary': [50000, 55000, 60000, 58000, 52000, 51000],
'Bonus': [5000, 7000, 6000, 5500, 4000, 4500]
}
df = pd.DataFrame(data)
# 同时计算 Salary 的最小值、最大值、均值和计数
df_grouped = df.groupby('Department').agg({
'Salary': ['min', 'max', 'mean', 'count']
})
print(df_grouped)
更详细的知识点学习链接:
7. 分析真实世界数据集的案例
一、从第三方库下载泰坦尼克号生存数据集
我们可以使用 Seaborn 库来下载泰坦尼克号数据集。Seaborn 是一个基于 Matplotlib 的数据可视化库,它提供了一些方便的函数来加载常用的数据集。
import seaborn as sns
# 使用 seaborn 库加载泰坦尼克号数据集
titanic_data = sns.load_dataset('titanic')
# 这里 sns.load_dataset('titanic') 函数会从 Seaborn 内置的数据集库中下载泰坦尼克号数据集,并返回一个 Pandas 的 DataFrame 对象,存储在 titanic_data 变量中。
二、数据加载
现在我们已经成功下载了数据集,接下来我们可以使用 Pandas 的一些方法来查看数据集的基本信息。
import pandas as pd
# 查看数据集的前几行
print(titanic_data.head())
# titanic_data.head() 返回数据集的前五行,方便我们快速了解数据集的结构和内容。
# 查看数据集的形状(行数和列数)
print(titanic_data.shape)
# titanic_data.shape 返回一个元组,包含数据集的行数和列数。
# 查看数据集的列名
print(titanic_data.columns)
# titanic_data.columns 返回一个 Index 对象,包含数据集的所有列名。
三、数据预处理
- 处理缺失值
泰坦尼克号数据集中可能存在缺失值,我们可以使用 Pandas 的方法来处理这些缺失值。
# 查看每列的缺失值数量
print(titanic_data.isnull().sum())
# titanic_data.isnull() 返回一个布尔型的 DataFrame,其中每个元素表示对应位置的数据是否为缺失值。然后使用 sum() 方法对每列的缺失值数量进行求和。
# 填充年龄列的缺失值为平均值
titanic_data['age'].fillna(titanic_data['age'].mean(), inplace=True)
# titanic_data['age'].fillna(...) 使用 fillna 方法将年龄列的缺失值填充为年龄列的平均值。inplace=True 表示直接在原数据上进行修改。
# 删除含有缺失值的行(这里以 embarked 列为例)
titanic_data.dropna(subset=['embarked'], inplace=True)
# titanic_data.dropna(...) 使用 dropna 方法删除含有缺失值的行。subset=['embarked'] 表示只考虑 embarked 列的缺失值。inplace=True 表示直接在原数据上进行修改。
- 数据类型转换
我们可以检查数据集的数据类型,并进行必要的转换。
# 查看数据类型
print(titanic_data.dtypes)
# titanic_data.dtypes 返回一个 Series 对象,其中每个元素表示对应列的数据类型。
# 将 sex 列转换为类别类型
titanic_data['sex'] = titanic_data['sex'].astype('category')
# titanic_data['sex'].astype('category') 使用 astype 方法将 sex 列的数据类型转换为类别类型。
# 将 embarked 列转换为类别类型
titanic_data['embarked'] = titanic_data['embarked'].astype('category')
# 同样,将 embarked 列的数据类型转换为类别类型。
- 重复数据处理
检查数据集中是否存在重复数据,并进行处理。
# 检查是否有重复行
print(titanic_data.duplicated().any())
# titanic_data.duplicated() 返回一个布尔型的 Series,表示每行是否为重复行。any() 方法用于检查是否存在任何重复行。
# 删除重复行
titanic_data.drop_duplicates(inplace=True)
# titanic_data.drop_duplicates() 使用 drop_duplicates 方法删除重复行。inplace=True 表示直接在原数据上进行修改。
四、简单探索性数据分析
- 使用 groupby 进行分组计算
我们可以使用 groupby 方法对数据集进行分组计算,例如计算不同性别乘客的平均年龄。
# 计算不同性别乘客的平均年龄
average_age_by_sex = titanic_data.groupby('sex')['age'].mean()
print(average_age_by_sex)
# titanic_data.groupby('sex') 根据性别列对数据集进行分组。['age'].mean() 计算每组的年龄平均值。
- 聚合函数
使用聚合函数对数据集进行统计分析,例如计算不同舱位等级乘客的数量、平均年龄和票价总和。
# 计算不同舱位等级乘客的数量、平均年龄和票价总和
aggregated_data = titanic_data.groupby('pclass').agg({'age': 'mean', 'fare': 'sum', 'survived': 'count'})
print(aggregated_data)
# titanic_data.groupby('pclass') 根据舱位等级列对数据集进行分组。agg({'age': 'mean', 'fare': 'sum', 'survived': 'count'}) 使用 agg 方法对每组应用不同的聚合函数,这里分别计算年龄的平均值、票价的总和和生存人数的数量。
问题解答
由于本系列是基础教程,所以有任何问题基本上国内免费的AI模型都能回答,有任何疑问或Bug可以寻求以下免费的大模型的解答。
- 豆包:https://www.doubao.com/chat/
- 文心一言:https://yiyan.baidu.com/
- 通义千问:https://tongyi.aliyun.com/qianwen/
- 讯飞星火:https://xinghuo.xfyun.cn/desk
如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!