vas*_*iop 2 python dataframe pandas
您好,我偶然发现pandas数据框的问题。我有这个数据框。
user event diff days
1001 request 45
1001 approve 43
1002 request 44
1002 approve 43
1002 request 42
1003 approve 41
1003 request 40
1003 approve 39
1003 request 38
Run Code Online (Sandbox Code Playgroud)
我想根据此规则创建新列标记:我们将问题定义为在每个用户上次请求后 45 天内不发出另一个请求。
输出应该如下所示。
user event diff Days flag
1001 request 45 Problem
1001 approve 43 Problem
1002 request 44 NoProblem
1002 approve 43 NoProblem
1002 request 42 NoProblem
1003 approve 41 NoProblem
1003 request 40 NoProblem
1003 approve 39 NoProblem
1003 request 38 NoProblem
Run Code Online (Sandbox Code Playgroud)
我无法使用np.where或np.select提出解决方案。欢迎任何类型的解决方案。
如果您想尝试一下,您可以使用它来重现我上面的数据框。
df = pd.DataFrame(data={'user': [1001, 1001, 1002, 1002, 1002, 1003, 1003, 1003, 1003],
'event': ['request', 'approve', 'request', 'approve', 'request', 'approve', 'request', 'approve', 'request'],
'Diff Days': [45, 43, 44, 43, 42, 41, 40, 39, 38]})
Run Code Online (Sandbox Code Playgroud)
注意:我需要将以下情况标记为问题:我们在上次请求(列差异天)后 45 天内没有为每个用户和事件(我的意思是仅请求)发出另一个请求。事件的其余字段不起作用。
编辑:
在评论中,您说您想标记用户在event哪里request和Diff Days >= 45。就是这样:
users_with_problems = df.loc[(df["event"] == "request") & (df["Diff Days"] >= 45), "users"]
df["Flag"] = "No problem"
df.loc[df["user"].isin(users_with_problem), "Flag"] = "Problem"
Run Code Online (Sandbox Code Playgroud)
编辑结束。
您似乎想Flag显示有单一问题的用户的所有行Problem。去做这个:
df["Flag"] = "No problem"
users_with_problem = df.loc[df["Diff Days"] >= 45, "user"]
df.loc[df["user"].isin(users_with_problem), "Flag"] = "Problem"
Run Code Online (Sandbox Code Playgroud)
这将返回:
user event Diff Days Flag
1001 request 45 Problem
1001 approve 43 Problem
1002 request 44 No problem
1002 approve 43 No problem
1002 request 42 No problem
1003 approve 41 No problem
1003 request 40 No problem
1003 approve 39 No problem
1003 request 38 No problem
Run Code Online (Sandbox Code Playgroud)
但是,您说过您只想在diff45 或更多时标记问题。您可以按如下方式执行此操作:
df["Flag"] = "No Problem"
df.loc[df["Diff Days"] >= 45, "Flag"] = "Problem"
Run Code Online (Sandbox Code Playgroud)
这只会标记以下行中的用户diff >= 45:
user event Diff Days Flag
1001 request 45 Problem
1001 approve 43 No problem
1002 request 44 No problem
1002 approve 43 No problem
1002 request 42 No problem
1003 approve 41 No problem
1003 request 40 No problem
1003 approve 39 No problem
1003 request 38 No problem
Run Code Online (Sandbox Code Playgroud)