Python 关于lambda的另一个问题,什么是;k";你是说这里?
谁能告诉我这里的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
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)
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以指示此处处理的内容:-)