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

Posted

技术标签:

【中文标题】将函数应用于 DataFrame 中的每个单元格【英文标题】:Apply function to each cell in DataFrame 【发布时间】:2017-01-21 09:44:56 【问题描述】:

我有一个可能如下所示的数据框:

A        B        C
foo      bar      foo bar
bar foo  foo      bar

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

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

A        B        C
wow      bar      wow bar
bar wow  wow      bar

是否有一个简单的单行程序可以将函数应用于每个单元格?

这是一个简单的示例,因此除了应用函数之外,可能还有一种更简单的方法来执行此特定示例,但我真正要问的是如何在数据框中的每个单元格中应用函数。

【问题讨论】:

我不认为将问题编辑为一个全新的问题是一个好主意,一旦你已经得到了旧问题的答案,因为它会使之前的答案无效。我会要求您回滚原来的问题并单独提出新的问题。 【参考方案1】:

您可以使用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

【讨论】:

您好,抱歉,问题是关于应用函数,而不是关于确定哪个单元格是偶数。让我看看我是否可以将示例更改为更清晰.. 如果你正在寻找应用函数,你可以做import numpy as np; df.apply(np.vectorize(iseven)) @eljusticiero67 您可以使用df.applymap(iseven),但请注意,对于较大的 DataFrame,它会变得非常慢,所以只要有机会,请使用矢量化方法。 @ayhan -- 你的方法似乎有效,无论有没有 np.vectorize。你介意发布答案,以便我可以给你功劳吗? 我其实一开始并没有发布它,因为我试图找到一个副本来链接它。我找不到完全相同的副本,但也许是this one? Nickil Maveli 是对的,你可以澄清意思,但至少我认为这个例子应该是一样的。也许 Psidom 可以编辑以包含他们自己的建议以及 applymap?【参考方案2】:

我猜你可以使用np.vectorize:

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

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

【讨论】:

以上是关于将函数应用于 DataFrame 中的每个单元格的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 如何将函数仅应用于 DataFrame 中的列子集?

在 DataFrame 上应用映射函数

有效地将函数并行应用于分组的 pandas DataFrame

如何将 groupBy 和聚合函数应用于 PySpark DataFrame 中的特定窗口?

将函数应用于数据框列?

将模型分数应用于 Spark DataFrame - Python