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 : 仅与聚合函数相关:
该Series的长度是索引的长度 或列的数量(基于axis参数) True : 结果将广播到框架的原始形状, 原始索引和列将保留。 从0.23.0版本开始就不推荐使用: 这个参数将在将来的版本中被删除, 取而代之的是 raw : bool, 默认 False False : 将每一行或每一列作为一个Series传递给函数。 True : t传递的函数将接收ndarray对象。 如只是应用一个NumPy约简函数, 这将获得更好的性能。 reduce : 试着使用减量程序。如果
应该是一个Series还是一个 如果
将通过在空序列上调用 来猜测(注意:在猜测时,
如果 如果 则始终返回一个 从0.23.0版本开始就不推荐使用: 这个参数将在将来的版本中被删除, 取而代之的是 result_type :
默认 这些只在 ‘expand’ : 类似列表的结果将转换为列。 ‘reduce’ : 如果可能,返回一个Series, 而不是展开类似列表的结果。这是‘expand’的反义词。 ‘broadcast’ : 结果将广播到 保留原始索引和列。 默认行为(None)取决于应用函数的返回值: 类似列表的结果将作为这些结果的Series返回。 但是,如果 这些列就会展开为列。 New in version 0.23.0. args : 除了 **kwds 要作为关键字参数传递给func的其他关键字参数。 |
返回: | applied : 或 |
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)