Python pandas.DataFrame.apply函数方法的使用

pandas.DataFrame.apply 是一个非常强大的方法,用于沿 DataFrame 的轴(行或列)应用函数。这个方法可以用来执行复杂的数据操作和转换。本文主要介绍一下Pandas中pandas.DataFrame.apply方法的使用。

DataFrame.apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)

沿着DataFrame的轴应用一个函数。

传递给函数的对象是Series对象,其索引要么是DataFrame的索引(轴=0),要么是DataFrame的列(axis=1)。默认情况下(result_type=None),最终的返回类型是从应用函数的返回类型推断出来的。否则,它取决于result_type参数。

参数:

func : function

作用于每一列或行。

axis : {0 或 ‘index’, 1 或 ‘columns’}, 默认 0

函数所应用的轴:

0 或 ‘index’: 对每一列应用函数。

1 或 ‘columns’: 对每一行应用函数。

broadcast : bool, 可选

仅与聚合函数相关:

False 或 None : 返回一个Series,

该Series的长度是索引的长度

或列的数量(基于axis参数)

True : 结果将广播到框架的原始形状,

原始索引和列将保留。

从0.23.0版本开始就不推荐使用:

这个参数将在将来的版本中被删除,

取而代之的是result_type= ' broadcast '

raw : bool, 默认 False

False : 将每一行或每一列作为一个Series传递给函数。

True : t传递的函数将接收ndarray对象。

如只是应用一个NumPy约简函数,

这将获得更好的性能。

reduce : bool None, 默认 None

试着使用减量程序。如果DataFrame为空,

apply将使用reducto确定结果

应该是一个Series还是一个DataFrame

如果reduce=None(缺省值),

apply的返回值

将通过在空序列上调用func

来猜测(注意:在猜测时,

func引发的异常将被忽略)。

如果reduce=True,则始终返回一个Series,

如果reduce=False

则始终返回一个DataFrame

从0.23.0版本开始就不推荐使用:

这个参数将在将来的版本中被删除,

取而代之的是result_type='reduce'

result_type : 

{‘expand’, ‘reduce’, ‘broadcast’, None}

默认 None

这些只在axis=1(列)时起作用:

‘expand’ : 类似列表的结果将转换为列。

‘reduce’ : 如果可能,返回一个Series,

而不是展开类似列表的结果。这是‘expand’的反义词。

‘broadcast’ : 结果将广播到DataFrame的原始形状,

保留原始索引和列。

默认行为(None)取决于应用函数的返回值:

类似列表的结果将作为这些结果的Series返回。

但是,如果apply函数返回一个Series,

这些列就会展开为列。

New in version 0.23.0.

args tuple

除了array/series外,还要传递给func的位置参数。

**kwds

要作为关键字参数传递给func的其他关键字参数。

返回:

applied Series 

DataFrame

Notes

在当前的实现中,apply在第一列/行上两次调用func,以决定它是采用快速代码路径还是慢代码路径。如果func有副作用,这可能会导致意想不到的行为,因为它们将对第一列/行起两次作用。

例子,

1)应用函数到每一列

有一个 DataFrame,我们想计算每一列的平方。

import pandas as pd

# 创建一个 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print("Original DataFrame:")
print(df)

# 定义一个计算平方的函数
def square(x):
    return x ** 2

# 应用函数到每一列
result = df.apply(square)
print("\nDataFrame after applying square function to each column:")
print(result)

2)应用函数到每一行

计算每一行的和。

import pandas as pd

# 创建一个 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print("Original DataFrame:")
print(df)

# 应用函数到每一行
result = df.apply(sum, axis=1)
print("\nSum of each row:")
print(result)

3)使用自定义函数

有一个 DataFrame,我们想定义一个函数,根据每一行的值来生成一个新的列。

import pandas as pd

# 创建一个 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print("Original DataFrame:")
print(df)

# 定义一个函数,根据每一行的值来生成一个新的列
def custom_function(row):
    return row['A'] + row['B']

# 应用自定义函数到每一行
df['C'] = df.apply(custom_function, axis=1)
print("\nDataFrame after applying custom function to each row:")
print(df)

4)应用带参数的函数

有时我们需要应用一个带参数的函数,可以通过 args 参数来实现。

import pandas as pd

# 创建一个 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print("Original DataFrame:")
print(df)

# 定义一个函数,计算每一列的值加上一个常数
def add_constant(x, constant):
    return x + constant

# 应用函数到每一列,传递一个参数
result = df.apply(add_constant, args=(10,))
print("\nDataFrame after applying add_constant function with constant=10 to each column:")
print(result)

    5)使用示例

    import pandas as pd
    import numpy as np
    
    # 创建一个示例 DataFrame
    df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
    print("Original DataFrame:")
    print(df)
    
    # 使用 numpy 通用函数
    df_sqrt = df.apply(np.sqrt)
    print("\nDataFrame after applying np.sqrt:")
    print(df_sqrt)
    
    # 在任意轴上使用还原函数
    # 对列应用求和函数
    df_sum_columns = df.apply(np.sum, axis=0)
    print("\nSum of each column:")
    print(df_sum_columns)
    
    # 对行应用求和函数
    df_sum_rows = df.apply(np.sum, axis=1)
    print("\nSum of each row:")
    print(df_sum_rows)
    
    # 重放类似列表的结果将是 Series
    df_list_result = df.apply(lambda x: [1, 2], axis=1)
    print("\nDataFrame after applying a lambda function returning a list:")
    print(df_list_result)
    
    # 使用 result_type='expand' 将列表展开到 DataFrame 的列
    df_expand_result = df.apply(lambda x: [1, 2], axis=1, result_type='expand')
    print("\nDataFrame after applying a lambda function with result_type='expand':")
    print(df_expand_result)
    
    # 返回一个 Series 类似于 result_type='expand'
    df_series_result = df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)
    print("\nDataFrame after applying a lambda function returning a Series:")
    print(df_series_result)
    
    # 使用 result_type='broadcast' 沿轴广播结果
    df_broadcast_result = df.apply(lambda x: [1, 2], axis=1, result_type='broadcast')
    print("\nDataFrame after applying a lambda function with result_type='broadcast':")
    print(df_broadcast_result)

    推荐阅读
    cjavapy编程之路首页