如何一次将函数应用于熊猫数据框中的多个列

Posted

技术标签:

【中文标题】如何一次将函数应用于熊猫数据框中的多个列【英文标题】:how to apply a function to multiple columns in a pandas dataframe at one time 【发布时间】:2014-03-31 22:49:25 【问题描述】:

我经常处理格式不正确的数据(即数字字段不一致等)

可能还有其他我不知道的方式,但我在数据框中格式化单个列的方式是使用函数并将列映射到该函数。

format = df.column_name.map(format_number)

问题:1 - 如果我有一个包含 50 列的数据框,并且想将该格式应用于多列等第 1、3、5、7、9 列,该怎么办?

你能走吗:

format = df.1,3,5,9.map(format_number)

.. 这样我可以在一行中格式化所有数字列?

【问题讨论】:

【参考方案1】:

你可以df[['Col1', 'Col2', 'Col3']].applymap(format_number)。请注意,尽管这将返回新列;它不会修改现有的 DataFrame。如果您想将这些值恢复为原始值,则必须执行df[['Col1', 'Col2', 'Col3']] = df[['Col1', 'Col2', 'Col3']].applymap(format_number)

【讨论】:

你能不能在这样做的时候按数字而不是名称来引用列?还有什么方法可以以编程方式创建该字符串(这会根据您拥有的列数而变化)并应用 format_number 函数? IE。如果我每次都确切地知道工作表中有多少列,上面的方法会很好,但是如果我不知道列的数量,并且想对每一列应用相同的函数,有没有更好的方法呢? @yoshiserry:如果你只想将它应用到所有列,只需执行df.applymap(format_number)【参考方案2】:

你可以像这样使用apply

df.apply(lambda row: format_number(row), axis=1)

您需要在 format_number 函数中指定列:

def format_number(row):
    row['Col1'] = doSomething(row['Col1']
    row['Col2'] = doSomething(row['Col2'])
    row['Col3'] = doSomething(row['Col3'])

这不像@BrenBarn 的回答那样优雅,但它的优点是数据框已就地修改,因此您无需再次重新分配列

【讨论】:

你能解释一下它被修改到位是什么意思吗,我不确定这与上述解决方案有何不同,因为我还没有掌握 lamda 的作用? @yoshiserry 忽略我的代码示例,如果您对数据框执行apply,那么数据框本身会被您的函数中的任何更改修改,因此您不需要分配给列,您可能仍然需要取决于您的功能正在做什么。关键是您只需要调用df.apply 而不需要说做df[['col1','col2','col3']]=df.apply(lambda row: format_number(row), axis=1)),在我的代码中,赋值是由format_number 函数完成的,所以我猜这个赋值是隐式的,而不是像BrenBarn 的答案那样显式的跨度> 太好了,那么Lamda的功能到底是什么?我还没搞懂 lamda 是做什么的? @yoshiserry 网上有很多文章如pythonconquerstheuniverse.wordpress.com/2011/08/29/…、***.com/questions/890128/python-lambda-why 和secnetix.de/olli/Python/lambda_functions.hawk。本质上,它允许您定义一个匿名函数,因此您不必定义一个特殊的函数或表达式。在这种情况下,它会捕获该行并将其作为参数传递给 format_number,它很容易是 df.apply(lambda x: x **2) 来平方值

以上是关于如何一次将函数应用于熊猫数据框中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

应用一个函数来翻译熊猫数据框中的一列,条件是其他列

熊猫应用函数将多个值返回到熊猫数据框中的行

将函数应用于两列并将输出映射到新列[重复]

如何将自定义函数应用于每行的熊猫数据框[重复]

如何根据列的值对熊猫数据框中的列进行分类?

熊猫应用功能 - 将每一行与整列进行比较