如何在 Pandas 中使用apply函数结合 lambda 函数处理多个列
参考:pandas apply lambda multiple columns
在数据分析和数据处理中,Pandas 是 Python 中一个非常重要的库。它提供了大量的功能来方便地处理和分析数据。其中,apply()
函数是一个非常强大的工具,它可以让我们对 DataFrame 或 Series 应用一个函数。当我们需要对多个列使用 lambda 函数时,apply()
尤其有用。本文将详细介绍如何在 Pandas 中使用 apply()
函数结合 lambda 函数处理多个列,并提供多个示例代码以帮助理解和实践。
1. 基本概念
在深入示例之前,我们首先需要理解一些基本概念。
1.1 DataFrame 和 Series
Pandas 中的 DataFrame 是一个二维标签数据结构,你可以把它想象成一个 SQL 表格,或者是一个字典类型的对象。它是由多个列组成的,每一列可以是不同的值类型(数值、字符串、布尔值等)。
Series 是 Pandas 中的一维标签数组,可以包含任何数据类型(整数、字符串、浮点数、Python 对象等)。Series 可以从列表、字典等构造。
1.2 apply() 函数
apply()
函数用于应用一个函数沿 DataFrame 的轴,通常用于行或列操作。当使用 apply()
函数时,你可以指定 axis 参数,axis=0
表示应用函数到每一列,axis=1
表示应用函数到每一行。
1.3 lambda 函数
lambda 函数是 Python 中的匿名函数,即没有具体名称的小函数。它仅由单个语句组成,该语句的结果就是返回值。在 Pandas 的 apply 函数中使用 lambda 函数可以让代码更加简洁。
2. 使用 apply() 和 lambda 函数处理多个列
接下来,我们将通过具体的示例来展示如何在 Pandas 中使用 apply()
和 lambda 函数处理多个列。
示例代码 1: 创建 DataFrame
import pandas as pd
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
print(df)
Output:
示例代码 2: 对多列应用 lambda 函数
import pandas as pd
data = {
'A': [10, 20, 30],
'B': [40, 50, 60],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
result = df.apply(lambda x: x['A'] + x['B'] if 'pandasdataframe.com' in x['C'] else x['A'], axis=1)
print(result)
Output:
示例代码 3: 修改多列数据
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df[['A', 'B']] = df.apply(lambda x: [x['A'] * 2, x['B'] * 2] if 'pandasdataframe.com' in x['C'] else [x['A'], x['B']], axis=1, result_type='expand')
print(df)
Output:
示例代码 4: 使用条件语句修改列值
import pandas as pd
data = {
'A': [1000, 2000, 3000],
'B': [4000, 5000, 6000],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['A'] = df.apply(lambda x: x['A'] + 100 if 'pandasdataframe.com' in x['C'] else x['A'], axis=1)
print(df)
Output:
示例代码 5: 结合多列生成新列
import pandas as pd
data = {
'A': [5, 10, 15],
'B': [20, 25, 30],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['D'] = df.apply(lambda x: x['A'] * x['B'] if 'pandasdataframe.com' in x['C'] else 0, axis=1)
print(df)
Output:
示例代码 6: 过滤数据
import pandas as pd
data = {
'A': [50, 100, 150],
'B': [200, 250, 300],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df.apply(lambda x: x['A'] > 50 and 'pandasdataframe.com' in x['C'], axis=1)]
print(filtered_df)
Output:
示例代码 7: 对列进行排序
import pandas as pd
data = {
'A': [500, 1000, 1500],
'B': [2000, 2500, 3000],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df_sorted = df.apply(lambda x: sorted([x['A'], x['B']]) if 'pandasdataframe.com' in x['C'] else [x['A'], x['B']], axis=1, result_type='expand')
print(df_sorted)
Output:
示例代码 8: 计算列的平均值
import pandas as pd
data = {
'A': [5000, 10000, 15000],
'B': [20000, 25000, 30000],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['Average'] = df.apply(lambda x: (x['A'] + x['B']) / 2 if 'pandasdataframe.com' in x['C'] else 0, axis=1)
print(df)
Output:
示例代码 9: 创建复合条件的新列
import pandas as pd
data = {
'A': [5, 10, 15],
'B': [20, 25, 30],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['New_Column'] = df.apply(lambda x: x['A'] + x['B'] if x['A'] > 10 and 'pandasdataframe.com' in x['C'] else 0, axis=1)
print(df)
Output:
示例代码 10: 使用多个条件修改多列
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df[['A', 'B']] = df.apply(lambda x: [x['A'] * 3, x['B'] * 3] if 'pandasdataframe.com' in x['C'] and x['A'] > 150 else [x['A'], x['B']], axis=1, result_type='expand')
print(df)
Output:
示例代码 11: 根据条件创建新的分类列
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['Category'] = df.apply(lambda x: 'High' if x['A'] > 250 and 'pandasdataframe.com' in x['C'] else 'Low', axis=1)
print(df)
Output:
示例代码 12: 对多列应用复杂的数学函数
import pandas as pd
import numpy as np
data = {
'A': [10, 20, 30],
'B': [40, 50, 60],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['Log_A'] = df.apply(lambda x: np.log(x['A']) if 'pandasdataframe.com' in x['C'] else x['A'], axis=1)
df['Sqrt_B'] = df.apply(lambda x: np.sqrt(x['B']) if 'pandasdataframe.com' in x['C'] else x['B'], axis=1)
print(df)
Output:
示例代码 13: 合并多列为一个字符串
import pandas as pd
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['Combined'] = df.apply(lambda x: f"{x['A']}_{x['B']}_{x['C']}" if 'pandasdataframe.com' in x['C'] else f"{x['A']}_{x['B']}", axis=1)
print(df)
Output:
示例代码 14: 应用条件逻辑以决定数据转换
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['Transformed_A'] = df.apply(lambda x: x['A'] ** 2 if 'pandasdataframe.com' in x['C'] and x['A'] > 100 else x['A'], axis=1)
print(df)
Output:
示例代码 15: 使用 apply() 来过滤 DataFrame
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df.apply(lambda x: x['A'] < 300 and 'pandasdataframe.com' in x['C'], axis=1)]
print(filtered_df)
Output:
示例代码 16: 对 DataFrame 的多个列进行统计分析
import pandas as pd
data = {
'A': [10, 20, 30],
'B': [40, 50, 60],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
stats = df.apply(lambda x: {"mean": x.mean(), "sum": x.sum()} if 'pandasdataframe.com' in x['C'] else {}, axis=0)
print(stats)
示例代码 17: 创建基于多列条件的复杂逻辑
import pandas as pd
data = {
'A': [5, 15, 25],
'B': [35, 45, 55],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['Complex'] = df.apply(lambda x: x['A'] + x['B'] if x['A'] > 10 and 'pandasdataframe.com' in x['C'] else x['B'], axis=1)
print(df)
Output:
示例代码 18: 使用 apply() 和 lambda 来清洗数据
import pandas as pd
data = {
'A': [' 100', '200 ', ' 300 '],
'B': ['400', ' 500', '600 '],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df_cleaned = df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
print(df_cleaned)
Output:
示例代码 19: 对多列进行条件格式化
import pandas as pd
data = {
'A': [1000, 2000, 3000],
'B': [4000, 5000, 6000],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df_formatted = df.apply(lambda x: f"{x['A']:,.2f} - {x['B']:,.2f}" if 'pandasdataframe.com' in x['C'] else f"{x['A']} - {x['B']}", axis=1)
print(df_formatted)
Output:
示例代码 20: 使用多列数据创建新的 DataFrame
import pandas as pd
data = {
'A': [10, 20, 30],
'B': [40, 50, 60],
'C': ['pandasdataframe.com', 'pandasdataframe.com', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
new_df = pd.DataFrame(df.apply(lambda x: {'New_A': x['A'] * 2, 'New_B': x['B'] * 2} if 'pandasdataframe.com' in x['C'] else {'New_A': x['A'], 'New_B': x['B']}, axis=1).tolist())
print(new_df)
Output:
以上示例展示了如何在 Pandas 中使用 apply()
函数和 lambda 表达式来处理多列数据。通过这些示例,可以看到 apply()
函数的灵活性和强大功能,使得数据处理变得更加高效和直观。