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 : 仅与聚合函数相关:
True : 结果将广播到框架的原始形状,原始索引和列将保留。 从0.23.0版本开始就不推荐使用:这个参数将在将来的版本中被删除,取而代之的是 raw : bool, 默认 False False : 将每一行或每一列作为一个Series传递给函数。 True : t传递的函数将接收ndarray对象。如果您只是应用一个NumPy约简函数,这将获得更好的性能。 reduce : 试着使用减量程序。如果 从0.23.0版本开始就不推荐使用:这个参数将在将来的版本中被删除,取而代之的是 result_type : {‘expand’, ‘reduce’, ‘broadcast’, None}, 默认 这些只在 ‘expand’ : 类似列表的结果将转换为列。 ‘reduce’ : 如果可能,返回一个Series,而不是展开类似列表的结果。这是‘expand’的反义词。 ‘broadcast’ : 结果将广播到 默认行为(None)取决于应用函数的返回值:类似列表的结果将作为这些结果的Series返回。但是,如果 New in version 0.23.0. args : 除了 **kwds 要作为关键字参数传递给func的其他关键字参数。 |
返回: | applied : |
Notes
在当前的实现中,apply在第一列/行上两次调用func,以决定它是采用快速代码路径还是慢代码路径。如果func有副作用,这可能会导致意想不到的行为,因为它们将对第一列/行起两次作用。
例子,
>>> df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
>>> df
A B
0 4 9
1 4 9
2 4 9
使用numpy通用函数(在本例中与np.sqrt(df)相同):
>>> df.apply(np.sqrt)
A B
0 2.0 3.0
1 2.0 3.0
2 2.0 3.0
在任意轴上使用还原函数:
>>> df.apply(np.sum, axis=0)
A 12
B 27
dtype: int64
>>> df.apply(np.sum, axis=1)
0 13
1 13
2 13
dtype: int64
重放一个类似列表的结果将是Series:
>>> df.apply(lambda x: [1, 2], axis=1)
0 [1, 2]
1 [1, 2]
2 [1, 2]
dtype: object
传递result_type= ' expand '将把类似列表的结果扩展到Dataframe的列:
>>> df.apply(lambda x: [1, 2], axis=1, result_type='expand')
0 1
0 1 2
1 1 2
2 1 2
在函数中返回一个Series类似于传递result_type='expand'。得到的列名将是Series索引:
>>> df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)
foo bar
0 1 2
1 1 2
2 1 2
传递result_type='broadcast'将确保函数返回相同的形状结果,无论是列表类型的还是标量类型的,并沿着轴进行广播。得到的列名将是原始列名
>>> df.apply(lambda x: [1, 2], axis=1, result_type='broadcast')
A B
0 1 2
1 1 2
2 1 2