【问题标题】:A further question about lambda, what does "k" mean here?关于 lambda 的另一个问题,“k”在这里是什么意思?
【发布时间】:2020-11-15 01:50:27
【问题描述】:

谁能告诉我这里的k是什么?

def rule(x, y):
    if x == 'high' and y > 10:
         return 1
    else:
         return 0
df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
df['new'] = df.apply(lambda k: rule(k['c1'], k['c2']), axis =  1)
df.head()

为什么我不能只使用以下内容?

df['new'] = df["c1","c2"].apply(rule['c1'], ['c2'])

【问题讨论】:

  • k 是数据行。
  • 谢谢,所以对于这样的语法: df2 = df.apply(lambda x : x + 10) ,x 是否也表示行?
  • 只有添加axis = 1才为行。否则函数应用于列,默认为axis = 0。
  • 是的。请注意上面@ipj 所说的内容。

标签: python pandas lambda apply


【解决方案1】:

这里应该理解两个方面。

func 在obj.apply(func) 中的参数

这取决于。您可以控制作为参数传递给 func 的内容:

  1. 如果obj 是pandas.DataFrame,就像你在df[["c1", "c2"]] 或只是df 上使用apply,那么请参考documentation of pd.DataFrame.apply()。请注意,还有参数axis,您可以使用它来控制函数是应用于行(1)还是列(0,默认值)。然后,有参数raw 可用于定义传递给func 的参数是pd.Series(False,默认)还是numpy 数组(True)。

    因此,默认情况下,列被传递给func (as.pd.Series)。现在,由于您拥有axis=1,因此数据将作为 pd.Series 逐行传递。这意味着,k 的类型将是 pd.Series,它将包含一行的数据。

  2. 如果obj 是pandas.Series,如果您使用df["col"],则参考documentation of pandas.Series.apply()。如您所见,在这种情况下,pandas 会将 Series 中的每个元素提供给函数(如果 func 一次处理一个值)或整个数组(如果 func 是 numpy ufunc)。

lambda 只是函数

lambda 中的k 只是参数的名称。例如,参见

myfunc = lambda k: rule(k['c1'], k['c2'])

大致相当于

def myfunc(k):
    return rule(k['c1'], k['c2'])  

为什么我不能只申请关注?

在下面一行

df['new'] = df["c1","c2"].apply(rule['c1'], ['c2'])

传递给apply 的参数将不可调用,这就是它不起作用的原因。由于rule 是一个函数,所以rule['c1'] 没有任何意义。该函数没有属性“c1”。


如果您只想知道应该如何完成,我建议您使用@ipj 的答案中的np.vectorize。

【讨论】:

    【解决方案2】:

    可以对任意函数进行矢量化:

    import numpy as np
    df['new'] = np.vectorize(rule)(df.c1, df.c2)
    
    

    以上解决方案不会改变您原来的功能。

    另一种方法是重写函数:

    def rule(row):
        if row['c1'] == 'high' and row['c2'] > 10:
             return 1
        else:
             return 0
    

    并将其应用于数据框:

    df['new'] = df.apply(rule, axis = 1)
    

    请注意,axis = 1 是按行将参数传递给应用的函数所必需的。

    【讨论】:

    • 谢谢!请允许我问:如果 row['c1'] == 'high' 并且 row['c2'] > 10,“row”是保留字吗?以及何时使用它?这是我第一次看到它。
    • 不,它不是保留的,它可以是任何名称,例如x。但我将其命名为 row 以指示此处处理的内容:-)
    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 2011-07-25
    • 2021-04-14
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多