我陷入了如何在数据框中创建四个新行的问题中,该数据框将在特定条件下由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)
给出1
和int(False)
给出0
在if ...
里面你有一个表达式给出True
或False
.
这不需要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