Pandas应用apply函数进行数据清洗
属于 pandas 库中的一个强大工具,在常见的编程场景中能够对 DataFrame 或 Series 的每一列或每一行应用函数。它不仅提供了极大的灵活性,并且具有显著的功能优势,在数据处理和分析方面发挥着重要作用。该方法通常被用来取代复杂的循环或其他手动处理方式,在提高代码简洁性和可读性的同时显著提升了效率。
本教程旨在深入探讨 DataFrame.apply 方法的应用场景与实现细节,并结合基础操作进行全面讲解。通过丰富的实际案例分析和真实场景演示, 读者能够掌握该技术的核心要领, 从而有效解决各种数据处理问题。
文章目录
- DataFrame.apply 函数
- 总结
DataFrame.apply 函数
该方法是pandas库中执行数据操作的关键工具之一。它允许按行或按列对 DataFrame 或 Series 应用自定义或内置功能,并通过一系列参数进行配置。这些参数包括 func(指定要应用的功能)、axis(决定了功能的应用方向)、raw(控制数据传递的方式)以及 result_type(影响输出结果的形式)。该方法为开发者提供了极高的操作灵活性,并能高效地完成从简单计算到复杂逻辑处理的各项任务。
| 参数 | 类型 | 说明 |
|---|---|---|
func |
函数或 lambda 表达式 |
需要应用到每行或每列的函数。可以是内置函数,也可以是自定义函数。 |
axis |
整数 | 指定函数应用的方向。0 表示按列应用函数,1 表示按行应用函数。默认值为 0。 |
raw |
布尔值 | 如果为 True,函数会直接应用到 ndarray(不作为 Series 处理),通常提升性能。默认值为 False。 |
result_type |
字符串 | 控制返回值类型。可以是 'expand'(扩展维度)、'reduce'(缩小维度)或 'broadcast'(广播到原 DataFrame 形状)。默认自动推断。 |
args |
元组 | 传递给 func 的额外参数。 |
**kwargs |
关键字参数 | 传递给 func 的额外关键字参数。 |
当我们调用 apply 函数时
基本操作
import pandas as pd
# 创建一个简单的 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
# 对每列求和
result = df.apply(sum, axis=0)
# 对每行求和
result_row = df.apply(sum, axis=1)
代码解读
以这个示例为例,在DataFrame中使用apply(sum, axis=0)时会对其每一列施加sum函数从而计算出每列的总值而当axis设为1时则会对每一行执行同样的操作可以看到该方法能够有效地处理不同维度的数据运算从而无需复杂的循环操作
除了内置函数之外, 另一个强大的功能是能够与自定义函数协同作用以执行复杂逻辑操作. 当遇到需要对每一列的数值执行复杂数学运算时
# 定义一个自定义函数
def custom_function(x):
return x**2 + 3
# 将自定义函数应用于每一列
result = df.apply(custom_function, axis=0)
代码解读
在这个例子中,在我开发的这个案例中(原文可能有误),个人开发了针对 DataFrame 数据执行运算的功能,在该功能中实现了将每一列的数据先平方后再加3的操作。借助 apply 方法可轻松实现对数据进行个性化处理的功能,并且无需编写多行代码来实现循环结构。
应用示例
DataFrame.apply 在实际工作中具有广泛的运用,在数据清洗、转换以及分析的过程中尤其常见,并且通常需要按照复杂规则对数据进行处理。
在这些实例中将演示如何采用 apply 来应对日常工作中的一些数据处理任务
数据清洗
在处理缺失数据时,可能需要基于某一列的数据生成新的数值字段,并通过设定特定规则来替代缺失值或更新现有数据。假设有一个电子表格存储员工信息,在其中可以根据设定的工作参数对员工薪资进行动态调整:例如,在绩效考核达标的情况下提升基础薪资标准,在工作年限超过五年的情况下增加额外奖励系数等
# 创建员工数据
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'salary': [5000, 4000, 3000],
'bonus': [500, 700, 600]
})
# 自定义函数,根据薪水和奖金计算总收入
def calculate_total_income(row):
return row['salary'] + row['bonus']
# 使用 apply 计算每个员工的总收入
df['total_income'] = df.apply(calculate_total_income, axis=1)
代码解读
这个实例说明了如何通过 apply 方法逐行计算每位员工的总收入。在涉及多列数据处理的情况下具有显著优势的方法不仅简化了代码,并且提升了操作的可读性。
数据转换
通常情况下,在数据分析过程中,某些字段可能需要被归类为特定的数据类型。例如,在处理日期或分类变量时,这一步骤可能会涉及对时间或类别信息的重新整理。假设我们希望将所有日期字段统一表示为 YYYY-MM-DD 格式,则后续操作需遵循此规则。
# 创建一个包含日期的 DataFrame
df = pd.DataFrame({
'date': ['2024/09/01', '2023-09-08', '01-09-2022']
})
# 定义一个转换日期格式的函数
def convert_date_format(date_str):
return pd.to_datetime(date_str).strftime('%Y-%m-%d')
# 使用 apply 对每个日期进行格式转换
df['formatted_date'] = df['date'].apply(convert_date_format)
代码解读
这个实例说明了如何借助 apply 方法来实现对日期格式的一致性处理。在数据清洗和预处理的过程中,这类问题较为常见,因此我们通常会采用 apply 方法来高效地完成大批量数据的格式转换。
文本数据的清洗
在处理文本数据时,通常会采取规范化的处理流程以确保数据质量。这包括消除多余空白字符、统一字体大小等基本操作步骤。举例而言,在实际操作中可能会选择对某个字段进行前后空格的清理并将其全部转为小写字体作为标准处理流程。
# 创建一个包含文本数据的 DataFrame
df = pd.DataFrame({
'text': [' Hello ', 'World ', ' Python ']
})
# 定义一个文本清洗的函数
def clean_text(text):
return text.strip().lower()
# 使用 apply 对每个文本进行格式清洗
df['cleaned_text'] = df['text'].apply(clean_text)
代码解读
该实例具体阐述了如何利用apply方法对文本数据进行批量处理,在此过程中将每个文本字符串经过端部空白删除及大小写的统一转换操作。在实际应用场景中,则是这种操作通常被用来清理用户的自由输入文本或作为自然语言处理任务所需的前期准备步骤。
多列数据合并
在一些数据处理场景中, 会涉及对多列数据执行复杂的运算或合并处理工作。例如, 一个典型的例子是拥有员工姓名、部门以及薪资信息的 DataFrame 数据表, 可以利用 apply 方法将这些原始字段整合到一个新的字段中, 并包含详细的信息内容
# 创建一个包含员工数据的 DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'department': ['HR', 'Engineering', 'Marketing'],
'salary': [5000, 7000, 6000]
})
# 定义一个函数,将多列合并成一条信息
def combine_info(row):
return f"{row['name']} works in {row['department']} and earns ${row['salary']}."
# 使用 apply 将多列合并成新的字符串
df['employee_info'] = df.apply(combine_info, axis=1)
代码解读
在这个例子中,在线自定义函数 combine_info 处理每一行中的多个列值,并将它们整理为一条完整的信息。借助 apply 方法,在线 DataFrame 中能够轻松地将多列数据整合为所需的形式。
多列数据的条件计算
在数据分析的过程中,可能需要基于多列数据进行条件判断与计算。例如,在一个包含产品的价格和折扣的DataFrame中,可以通过apply方法计算每个产品的最终价格:当折扣超过20%时,则对相应产品的价格实施折扣。
# 创建一个包含产品价格和折扣的 DataFrame
df = pd.DataFrame({
'product': ['A', 'B', 'C'],
'price': [100, 200, 300],
'discount': [0.10, 0.25, 0.15]
})
# 定义一个函数,根据价格和折扣计算最终价格
def calculate_final_price(row):
if row['discount'] > 0.2:
return row['price'] * (1 - row['discount'])
else:
return row['price']
# 使用 apply 计算每个产品的最终价格
df['final_price'] = df.apply(calculate_final_price, axis=1)
代码解读
在这一案例中,该函数接收每一行的数据,并基于 price 和 discount 列的值计算最终价格。当折扣超过20%时,则应用折扣;否则保留原价。借助 apply 方法,在多个条件的基础上灵活处理数据并生成新的列。
总结
pandas 提供了功能强大的 DataFrame.apply 工具广泛应用于各种复杂的数据处理场景。通过对其行或列执行操作开发人员能够方便地执行自定义数据操作从简单的求和到复杂的自定义逻辑都能通过这一方法显著简化代码架构。
这种灵活性使 apply 成为解决数据分析与数据清洗问题的关键工具;在特定领域中发挥着不可替代的作用。熟练掌握这一功能不仅能够显著提升代码的可读性和执行效率;还能够带来更为丰富的应用场景与更多元的数据分析解决方案。
