根据规则熊猫数据框创建新列

时间:2019-05-11 16:09:22

标签: python pandas dataframe

嗨,我偶然发现了 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天内我们没有提出另一个请求(我仅表示请求)。事件中的其余字段不起作用。

1 个答案:

答案 0 :(得分:1)

编辑:

在评论中,您说过要标记eventrequestDiff 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