【问题标题】:Using Lambda with function that takes argument from different columns of dataframe将 Lambda 与从数据框的不同列获取参数的函数一起使用
【发布时间】:2017-05-08 14:01:50
【问题描述】:

我想学习如何在这种类型的设置中使用 lambda,而不使用 for 循环,该循环中的函数从数据帧的两列的行中获取参数并将结果写入另一列。

import pandas as pd

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})

print(df)

df["C"] = ""

print(df)

def add_num(num1 ,num2):
    return num1 + num2

for i in range(len(df)):
   df["C"][i] = add_num(df["A"][i], df["B"][i])
print(df)

【问题讨论】:

    标签: python pandas dataframe lambda


    【解决方案1】:

    您可以在传递 arg axis=1 的 df 上调用 apply 这将逐行迭代,然后您可以在 lambda 中子选择感兴趣的列以传递给您的函数:

    In [49]:    
    df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
    df["C"] = ""
    ​
    def add_num(num1 ,num2):
        return num1 + num2
    ​
    df["C"] = df.apply(lambda x: add_num(x["A"],  x["B"]), axis=1)
    print(df)
    
       A  B  C
    0  1  2  3
    1  2  3  5
    2  3  4  7
    

    请注意,应避免使用apply,大多数操作都可以使用矢量化方法执行,我知道这只是为了学习,但您应该寻找一个 numpy 或其他矢量化的 ufunc

    【讨论】:

    • 还有一个问题=) 这个版本和for循环版本有性能差异吗?
    • 不,这不是真的。在调用时调用 lambda 转发到 add_num 函数将比在循环中直接调用 add_num 慢。然而,apply 的循环可能更有效。但我的猜测是lambda 的抽象会更慢。
    • @MSeifert 我指的是apply 而不是lambda 部分
    【解决方案2】:

    应该这样做:

    import pandas as pd
    
    df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
    
    def add_num(num1 ,num2):
        return num1 + num2
    
    df['C'] = df.T.apply(lambda x: add_num(x['A'], x['B']))
    

    【讨论】:

      【解决方案3】:

      显而易见的答案是:当更简单的表达式起作用时,不要使用lambda

      df['C'] = df['A'] + df['B']
      

      因为这将使用矢量化操作。

      lambdaapply 的方法已经被@EdChum 的回答所涵盖,所以我不会再展示了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-22
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多