【问题标题】:Python apply class method to row of data framePython将类方法应用于数据框行
【发布时间】:2016-01-06 10:04:01
【问题描述】:

我的类需要一行数据框来构造一个对象,我想通过将 init 应用于数据框的每一行来创建一个对象数组。有没有办法对此进行矢量化?我的类定义看起来像

class A(object):
    def __init__(self,row):
        self.a = row['a']
        self.b = row['b']

任何建议都将受到高度赞赏!

我有一种我不太满意的方法来解决这个问题。在类之外定义另一个函数,然后使用 apply。

def InitA(row):
    return A(row)

假设 df 是我想用作参数的数据框。

xxx = df.apply(InitA,axis=1)

给我想要的。不过,我不认为 InitA 是必要的。

我原来的问题有点复杂。类定义是

class A(object):
    def __init__(self):
        return
    def add_parameter(self,row):
        self.a = row['a']

我打算将 add_parameter 应用于数据框的每一行。但我认为定义另一个(lambda)函数是解决这个问题的必要条件。

【问题讨论】:

    标签: python pandas vectorization


    【解决方案1】:

    只使用 lambda 函数?

    xxx = df.apply(lambda x: A(x),axis=1)

    编辑: 另一种解决方案是直接传递类,然后apply-function调用构造函数:

    xxx = df.apply(A,axis=1)

    这行得通:

    import pandas as pd 
    
    class C(object):
        def __init__(self,dat):
            return
    
    A = pd.DataFrame({'a':pd.Series([1,2,3])})
    A.apply(lambda x: C(x),axis=1)
    

    【讨论】:

    • 使用 lambda 函数是在外部定义 InitA 的一种简洁方式。我希望有一种方法可以完全避免定义另一个函数。但也许这不存在。
    • 是的,这是一个很好的解决方案。我原来的问题比这里发布的要复杂一些。我现在认为需要一个 lambda 函数来解决它。感谢您的帮助!
    • 不建议在python中从__init__返回。
    【解决方案2】:

    我认为 IMO 最好的做法(我确实觉得这是主观的)是在你的类上创建一个包装函数。

    我不知道这是否真的是最好的解决方案,但它比接受的答案更好。

    def wrap_class(row_element):
        
        c = MyClass(arg=row_element)
        return c.DoStuff()
    

    __init__is strongly discouraged返回。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 2022-10-04
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多