AI闪电战:代码+实战 从Python速通到深度学习|数据处理与分析——Pandas2

想要查看本系列的其他文章请到作者主页中。
学习提示:在有别的编程基础之上,学习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 或中位数等合理的方式进行填充。
练习:
  1. 创建一个包含缺失值的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 参数来指定哪些列需要用于检查重复数据。
练习:
  1. 创建一个包含重复行的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() 方法用于将一列数据类型转换为另一种数据类型,如 intfloatstrdatetime
  • 转换之前需确保数据格式正确,否则可能会引发转换错误。
练习:
  1. 创建一个包含价格和数量的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() 可以对 SeriesDataFrame 的列或行应用函数。
  • applymap() 用于对 DataFrame 中的每个元素应用函数,适合矩阵式操作。
练习:
  1. 创建一个包含商品名称和价格的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。
练习:
  1. 创建一个包含列名 itemcost 的DataFrame,将其列名分别修改为 ProductPrice
答案:
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 可以丢弃原来的索引。
练习:
  1. 创建一个包含 Student_IDName 的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() 等常用聚合操作。
  • 分组操作返回的是一个分组对象,需要进行后续的聚合操作。
练习:
  1. 创建一个包含部门和员工工资的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() 可以同时应用多个聚合函数,适合复杂的聚合需求。
练习:
  1. 创建一个包含多个数值列的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(),我们可以对数据进行更复杂的聚合操作,返回的结果会有多重索引。
  • 适合需要同时进行多种聚合的场景,比如同时计算总和、均值、最大值等。
练习:
  1. 使用 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 对象,包含数据集的所有列名。

三、数据预处理

  1. 处理缺失值

泰坦尼克号数据集中可能存在缺失值,我们可以使用 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 表示直接在原数据上进行修改。
  1. 数据类型转换

我们可以检查数据集的数据类型,并进行必要的转换。

# 查看数据类型
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 列的数据类型转换为类别类型。
  1. 重复数据处理

检查数据集中是否存在重复数据,并进行处理。

# 检查是否有重复行
print(titanic_data.duplicated().any())
# titanic_data.duplicated() 返回一个布尔型的 Series,表示每行是否为重复行。any() 方法用于检查是否存在任何重复行。

# 删除重复行
titanic_data.drop_duplicates(inplace=True)
# titanic_data.drop_duplicates() 使用 drop_duplicates 方法删除重复行。inplace=True 表示直接在原数据上进行修改。

四、简单探索性数据分析

  1. 使用 groupby 进行分组计算

我们可以使用 groupby 方法对数据集进行分组计算,例如计算不同性别乘客的平均年龄。

# 计算不同性别乘客的平均年龄
average_age_by_sex = titanic_data.groupby('sex')['age'].mean()
print(average_age_by_sex)
# titanic_data.groupby('sex') 根据性别列对数据集进行分组。['age'].mean() 计算每组的年龄平均值。
  1. 聚合函数

使用聚合函数对数据集进行统计分析,例如计算不同舱位等级乘客的数量、平均年龄和票价总和。

# 计算不同舱位等级乘客的数量、平均年龄和票价总和
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

如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人工智能技术小白修炼手册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值