【问题标题】:Apply Function to DataFrame with Unknown Number of Columns将函数应用于列数未知的 DataFrame
【发布时间】:2021-07-23 11:43:00
【问题描述】:

我有许多 pandas 数据框,它们的列数和列名不同,但包含相似的数据(1 和 0)。我想应用一个适用于所有这些数据帧的函数。

这是一个简单的例子:

构建数据框:

data = {'A':[1,2,3], 'B':[4,5,6], 'C':[7,8,9]}
df = pd.DataFrame(data)

定义函数:

def my_fn(a, b, c):
ans = a * b * c
return ans

将函数应用于数据框:

df.apply(lambda x: my_fn(x.A, x.B, x.C), axis=1)

问题:这当然可行,但如果下一个数据框有 5 列(A、B、C、D、E)怎么办?我的函数应该是 my_fn(a, b, c, d, e)。我可能有 1000 个数据框需要像这样处理,列数不同。

我使用 Exec() 的尝试:

my_cols = list(df.columns)
my_cols = ['x.' + item for item in my_cols]
args_str = ', '.join(my_cols)   #This gives--> 'x.A, x.B, x.C, x.D, x.E'
df.apply(lambda x: exec(my_fn(args_str)), axis=1)

结果: TypeError:my_fn() 缺少 4 个必需的位置参数:'b'、'c'、'd' 和 'e'

进一步的想法:
我阅读了其他类似的帖子并建议使用字典,但在我看来,这些问题完全不同。也许我完全以错误的方式解决了这个问题(很可能)。或者也许有一个我没有想到的简单解决方案(更有可能)。有人可以帮忙吗?

【问题讨论】:

    标签: python pandas lambda apply


    【解决方案1】:

    你基本上自己回答了这个问题。

    df.apply(lambda x: my_fn(x.A, x.B, x.C), axis=1)
    

    这里您使用的是带有参数x 的lambda 函数,它代表一行。您甚至可以访问不同的列 (x.A x.B x.C)。这意味着您需要的所有值都已经存储在x 中,因此x 是一个可迭代的。事实上,它是一个 pandas Series 对象。

    无需将x 拆分为不同的值以将它们传递给另一个函数。将您的逻辑直接放入您传递给apply 的函数中。

    def my_func(row):
        for col in row:
            # do something with col value
        return # some result
    
    df.apply(my_func, axis=1)
    

    循环不关心数据框中有多少列,它只会处理传递了多少列。

    如果您想对x 应用某种数值计算。您也可以使用 numpy,例如。您将所有列按行相乘的示例:

    import numpy as np
    
    def my_func(row):
        return np.product(row)
    
    df.apply(my_func, axis=1)
    

    或作为 lambda 函数:

    df.apply(lambda x: np.product(x), axis=1)
    

    您还可以查看apply 文档以获取有关该方法如何工作的更多信息:

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

    【讨论】:

    • 非常感谢您提供的快速且详细描述的解决方案,sarrysyst。该解决方案有效,并且我现在对 apply 方法也有了更好的了解。
    猜你喜欢
    • 2016-05-15
    • 2017-03-16
    • 2017-10-18
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多