【问题标题】:pandas dataframe fast apply function on multiple columns熊猫数据框在多列上快速应用功能
【发布时间】:2018-08-13 07:51:31
【问题描述】:

我有一个包含多列的数据框 df(不确定有多少列)。其中一列称为x。我已经定义了一个函数my_function,它接受两列作为输入,并对它们执行一些操作并返回一个新列。 我想在数据框的所有列上执行my_function(df[x], df[y])(其中y 是除x 之外的所有列)并返回一个具有完全相同列名的新df,但从my_function 更新值:

new_df = my_function(df[x], df[y]) 

其中 y = df 中除 x 之外的所有列。最快的方法是什么?

【问题讨论】:

  • 为了最快的方式,您需要告诉我们更多关于my_function的信息。你的计算可能是矢量化的。

标签: python pandas function dataframe apply


【解决方案1】:

如果您的函数执行逐行预处理,您可以对每一列使用方法 apply(请参阅doc):

columns = [item for item in df.columns.values if item!=x]
for c in coulmns:
   df[c] = df.apply(lambda row: my_function(row[c], row[x]) ,axis=1)

如果没有,你能分享“my_function”的身体吗?

最佳,

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    x = 'col_name'
    [my_function(df[x], df[col]) for col in df if col!=x]
    

    例子:

    df = pd.DataFrame( {'a':[1,2],'b':[4,3],'c':[5,9], 'd':[2,9]})
    x = 'a'
    df1 = pd.DataFrame({})
    def my_function(a,b, name):
        c = a+b
        df1[name] = c
    
    [my_function(df[x], df[col], name) for name, col in enumerate(df) if col!=x]
    print df1
    

    输出:

       1   2   3
    0  5   6   3
    1  5  11  11
    

    【讨论】:

    • 谢谢!但是可以将结果分配给具有相同列的 new_df 吗? (df 数据的每个 col 都在 my_function 处处理,处理结果将在 new_df 中)?我尝试了以下但不起作用! [new_df[col]= my_function(df[x], df[col]) for col in df if col!=x]
    • @sst 我已经用一个例子更新了答案,如果可以,请告诉我。我添加了第三个参数,即列名,但如果您愿意,可以在函数内定义名称
    【解决方案3】:

    对于更快的 pandas 应用函数,一个快速而好的解决方案可能是使用 swifter,这里是一个示例:

    import pandas as pd
    import swifter
    
    def fnc(m,x,c):
        return m*x+c
    
    df = pd.DataFrame({"m": [1,2,3,4,5,6], "c": [1,1,1,1,1,1], "x":[5,3,6,2,6,1]})
    df["y"] = df.swifter.apply(lambda x: fnc(x.m, x.x, x.c), axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 2015-09-30
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多