如何修改lambda函数与if语句一起使用?



我陷入了如何在数据框中创建四个新行的问题中,该数据框将在特定条件下由1和0填充。我决定使用Lambda函数,但它返回的不是数字,而是<function <lambda> at 0x000002B0251C7700>

我做错了什么,怎么可能解决它?

这是我使用的代码:

df["1_quarter"] = lambda row : 1 if (df["stage_x"] <= (0.25 * df["stage_y"])) else 0
df["2_quarter"] = lambda row : 1 if (df["stage_x"] > (0.25 * df["stage_y"]) and df[stage_x] <= (0.5 * df["stage_y"])) else 0
df["3_quarter"] = lambda row : 1 if (df["stage_x"] > (0.5 * df["stage_y"]) and df[stage_x] <= (0.75 * df["stage_y"])) else 0
df["4_quarter"] = lambda row : 1 if (df["stage_x"] > (0.75 * df["stage_y"]) and df[stage_x] <= (df["stage_y"])) else 0 

lambda只定义函数但不执行。

你可能不得不使用它与.apply()运行在每一行-但在lambda你应该使用row[...]而不是df[...]

func1 = lambda row : 1 if (row["stage_x"] <= (0.25 * row["stage_y"])) else 0
df["1_quarter"] = df.apply(func1, axis=1)

或在一行中,但可读性较差

df["1_quarter"] = df.apply( (lambda row : 1 if (row["stage_x"] <= (0.25 * row["stage_y"])) else 0), axis=1)

最终你可以使用int(True)给出1int(False)给出0
if ...里面你有一个表达式给出TrueFalse.
这不需要lambda

df["1_quarter"] = (df["stage_x"] <= (0.25 * df["stage_y"])).astype(int)

您可以对numpy.where( expression, value_for_True, value_for_False )

做同样的操作
df["1_quarter"] = np.where(df["stage_x"] <= (0.25 * df["stage_y"]), 1, 0)

最小工作示例:

import pandas as pd
data = {
'stage_x': [1,2,3,4], 
'stage_y': [4,5,6,16], 
}
df = pd.DataFrame(data)
func1 = lambda row : 1 if (row["stage_x"] <= (0.25 * row["stage_y"])) else 0
df["1_quarter_A"] = df.apply(func1, axis=1)
df["1_quarter_B"] = (df["stage_x"] <= (0.25 * df["stage_y"])).astype(int)
df["1_quarter_C"] = np.where(df["stage_x"] <= (0.25 * df["stage_y"]), 1, 0)
print(df)

结果:

stage_x  stage_y  1_quarter_A  1_quarter_B  1_quarter_C
0        1        4            1            1            1
1        2        5            0            0            0
2        3        6            0            0            0
3        4       16            1            1            1

最新更新