pandas 将函数应用于DataFrame中的每个单元格

w8f9ii69  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(172)

我有一个 Dataframe ,可能看起来像这样:

A        B        C
foo      bar      foo bar
bar foo  foo      bar

我想查看每行的每个元素(或每列的每个元素),并应用以下函数来获取后续 Dataframe :

def foo_bar(x):
    return x.replace('foo', 'wow')

应用函数后, Dataframe 将如下所示:

A        B        C
wow      bar      wow bar
bar wow  wow      bar

是否有一个简单的一行程序可以对每个单元格应用一个函数?
这是一个过于简单的例子,所以除了应用函数之外,可能还有更简单的方法来执行这个特定的例子,但我真正想问的是如何在 Dataframe 内的每个单元格中应用函数。

az31mfrm

az31mfrm1#

您可以使用applymap(),这对于您的情况来说是简洁的。

df.applymap(foo_bar)

#     A       B       C
#0  wow     bar wow bar
#1  bar wow wow     bar

另一种选择是将函数矢量化,然后使用apply方法:

import numpy as np
df.apply(np.vectorize(foo_bar))
#     A       B       C
#0  wow     bar wow bar
#1  bar wow wow     bar
hfwmuf9z

hfwmuf9z2#

我想您可以使用np.vectorize

>>> df[:] = np.vectorize(foo_bar)(df)
>>> df
       A    B    C
foo  bar  wow  bar
bar  wow  wow  bar
>>>

这可能会更快,因为它使用的是numpy

t0ybt7op

t0ybt7op3#

Psidom's answer上展开,如果您定义的函数接受额外的参数,那么您可以使用kwargs传递它们。例如,要在OP中切换replfoo_bar()

def foo_bar(x, bar=''):
    return x.replace('foo', bar)

df.applymap(foo_bar, bar='haha')

字符串操作是applymap特别有用的常见情况之一(如OP中)。由于panda中的字符串操作没有经过优化,因此循环通常比矢量化操作执行得更好,尤其是在有许多操作的情况下。例如,对于以下使用条件替换帧中的值的简单任务,applymap比等效的矢量化panda代码快3倍以上。

def foo_bar(x):
    return x.replace('foo', 'wow') if len(x)>3 else x + ' this'

df = pd.DataFrame([['foo', 'bar', 'foo bar'], ['bar foo', 'foo', 'bar']]*500000, columns=[*'ABC'])

%timeit df.applymap(foo_bar)
# 1.47 s ± 37.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df.apply(lambda x: np.where(x.str.len()>3, x.str.replace('foo', 'wow'), x + ' this'))
# 4.64 s ± 597 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

相关问题