pandas apply函数在每一行的应用
参考:pandas apply function to each row
Pandas 是一个强大的 Python 数据分析库,它提供了许多方便的功能来处理和分析数据。其中,apply
函数是一个非常有用的工具,它可以让用户对 DataFrame 或 Series 中的数据进行复杂的处理。本文将详细介绍如何在 pandas 中使用 apply
函数对每一行进行操作,并提供多个示例代码以帮助理解和掌握这一技术。
1. apply
函数简介
apply
函数可以被用于 pandas 的 Series 和 DataFrame 对象。当用于 DataFrame 时,它默认按列操作,但可以通过设置 axis
参数为 1 来改为按行操作。apply
函数的基本语法如下:
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)
func
: 要应用于每个元素或行/列的函数axis
: 默认为 0,意味着函数应用在每一列上。设置为 1 则函数应用在每一行上。raw
: 如果为 True,则传递给 func 的是 ndarray 对象,如果为 False,则传递的是 Series 对象。result_type
: 可以是expand
、reduce
或broadcast
,用于控制输出结果的形式。args
和**kwds
: 传递给func
的额外参数。
2. 在每一行上使用 apply
函数
使用 apply
函数对每一行进行操作时,通常的目的是根据行中的数据计算新的值或执行特定的数据处理。下面通过多个示例来展示如何实现这些操作。
示例代码 1: 计算每行的总和
import pandas as pd
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
def calculate_row_sum(row):
return row.sum()
df['Sum'] = df.apply(calculate_row_sum, axis=1)
print(df)
Output:
示例代码 2: 根据条件修改每行的数据
import pandas as pd
data = {
'A': [10, 20, 30],
'B': [40, 50, 60],
'C': [70, 80, 90]
}
df = pd.DataFrame(data)
def modify_row(row):
if row['A'] > 15:
return row * 2
return row
df = df.apply(modify_row, axis=1)
print(df)
Output:
示例代码 3: 将每行的数据转换为字符串格式
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': [700, 800, 900]
}
df = pd.DataFrame(data)
def convert_to_string(row):
return row.astype(str) + "_pandasdataframe.com"
df = df.apply(convert_to_string, axis=1)
print(df)
Output:
示例代码 4: 计算每行中最大值和最小值的差
import pandas as pd
data = {
'A': [5, 15, 25],
'B': [35, 45, 55],
'C': [65, 75, 85]
}
df = pd.DataFrame(data)
def max_min_diff(row):
return row.max() - row.min()
df['Max_Min_Diff'] = df.apply(max_min_diff, axis=1)
print(df)
Output:
示例代码 5: 根据行中某列的值决定如何处理其他列
import pandas as pd
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
def process_row_based_on_column_a(row):
if row['A'] == 2:
return row * 3
return row
df = df.apply(process_row_based_on_column_a, axis=1)
print(df)
Output:
示例代码 6: 添加新列,其中包含每行数据的描述
import pandas as pd
data = {
'A': [10, 20, 30],
'B': [40, 50, 60],
'C': [70, 80, 90]
}
df = pd.DataFrame(data)
def add_description(row):
return f"Row with A={row['A']}, B={row['B']}, C={row['C']} at pandasdataframe.com"
df['Description'] = df.apply(add_description, axis=1)
print(df)
Output:
示例代码 7: 使用外部参数在 apply
函数中
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': [700, 800, 900]
}
df = pd.DataFrame(data)
def scale_row(row, factor):
return row * factor
factor = 0.5
df_scaled = df.apply(scale_row, axis=1, args=(factor,))
print(df_scaled)
Output:
示例代码 8: 根据每行的统计数据分类数据
import pandas as pd
data = {
'A': [5, 10, 15],
'B': [15, 20, 25],
'C': [25, 30, 35]
}
df = pd.DataFrame(data)
def classify_row(row):
mean = row.mean()
if mean > 20:
return 'High'
elif mean > 10:
return 'Medium'
else:
return 'Low'
df['Class'] = df.apply(classify_row, axis=1)
print(df)
Output:
示例代码 9: 将每行转换为 JSON 字符串
import pandas as pd
data = {
'A': [100, 200, 300],
'B': [400, 500, 600],
'C': [700, 800, 900]
}
df = pd.DataFrame(data)
def row_to_json(row):
return row.to_json()
df['JSON'] = df.apply(row_to_json, axis=1)
print(df)
Output:
示例代码 10: 在每行中应用复杂的逻辑
import pandas as pd
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
def complex_logic(row):
if row['A'] > 1 and row['B'] < 6:
return row['C'] * 2
return row['C'] + 10
df['Result'] = df.apply(complex_logic, axis=1)
print(df)
Output:
以上示例展示了如何使用 pandas 的 apply
函数在 DataFrame 的每一行上执行不同的操作。通过这些示例,可以看到 apply
函数的灵活性和强大功能,它能够处理各种复杂的数据操作需求。在实际应用中,根据具体的数据处理需求灵活使用 apply
函数,可以大大提高数据处理的效率和质量。