根据 Pandas 数据框规则创建新列

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.wherenp.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 天内没有为每个用户和事件(我的意思是仅请求)发出另一个请求。事件的其余字段不起作用。

Art*_*Sbr 5

编辑:

在评论中,您说您想标记用户在event哪里requestDiff 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)