Python 关于lambda的另一个问题,什么是;k";你是说这里?

Python 关于lambda的另一个问题,什么是;k";你是说这里?,python,pandas,lambda,apply,Python,Pandas,Lambda,Apply,谁能告诉我这里的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

谁能告诉我这里的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'])

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

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
上述解决方案不会改变您原来的功能

另一种方法是重写函数:

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
是按行将参数传递给应用的函数所必需的。

这里有两个方面需要理解

obj.apply(func)
视情况而定。您可以控制作为参数传递给
func
的内容:

  • 如果
    obj
    是一个pandas.DataFrame,就像您在
    df[[“c1”,“c2”]]
    上使用apply或只使用
    df
    时一样,请参阅。请注意,还有一个参数
    axis
    ,您可以使用该参数控制函数是应用于行(1)还是列(0,默认值)。然后,可以使用参数
    raw
    来定义传递给
    func
    的参数是pd.Series(False,默认值)还是numpy数组(True)

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

  • 如果
    obj
    与使用
    df[“col”]
    时的熊猫系列相同,请参阅。如您所见,在这种情况下,pandas将向函数提供序列中的每个元素(如果func一次处理一个值)或整个数组(如果
    func
    为numpy ufunc)

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

    myfunc=lambda k:rule(k['c1'],k['c2'])
    
    大致相当于

    def myfunc(k):
    返回规则(k['c1'],k['c2'])
    
    为什么我不能只申请以下内容? 在下面的行中

    df['new']=df[“c1”,“c2”]。应用(规则['c1'],['c2'])
    
    传递给
    apply
    的参数将不可调用,这就是此方法不起作用的原因。由于
    规则
    是一个函数,
    规则['c1']
    毫无意义。该函数没有属性“c1”



    如果你只是想知道如何做到这一点,我建议使用@ipj的答案中的
    np.vectorize

    k
    是数据行。谢谢,对于这样的语法:df2=df.apply(lambda x:x+10),x是否也表示行?只有添加
    axis=1
    时,它才是行。否则,函数将应用于列,默认值为轴=0。是。请注意上面@ipj所说的。谢谢!请允许我问:如果第['c1']=='high'行和第['c2']]>10行,“row”是保留字吗?什么时候使用它?这是我第一次看到它。不,它不是保留的,它可以是任何名称,例如
    x
    。但我将其命名为row以指示此处处理的内容:-)