嗨,我偶然发现了 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
我想根据此规则创建新列 Flag :我们将“问题”定义为在对每个用户发出最后个请求后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
我无法使用 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]})
N.B。我仅在以下情况下将问题标记为问题:在每个用户和事件的最后一个请求(列差异天)之后的45天内我们没有提出另一个请求(我仅表示请求)。事件中的其余字段不起作用。
答案 0 :(得分:1)
编辑:
在评论中,您说过要标记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"
编辑结束。
似乎您希望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"
这将返回:
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
但是,您说过,您只想标记diff
为45或更大的问题。您可以按照以下步骤进行操作:
df["Flag"] = "No Problem"
df.loc[df["Diff Days"] >= 45, "Flag"] = "Problem"
这只会标记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