Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于规则数据框创建新列_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于规则数据框创建新列

Python 基于规则数据框创建新列,python,pandas,dataframe,Python,Pandas,Dataframe,嗨,我偶然发现了熊猫数据框的问题。 我有这个数据框 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

嗨,我偶然发现了熊猫数据框的问题。 我有这个数据框

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
我想根据这个规则创建一个新的列标志:我们将问题定义为在每个用户的最后一个请求后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]})
注意:我需要将上次请求后45天内未提出另一个请求的情况标记为“仅问题”情况,每个用户的“差异天数”列和“事件”仅表示请求。事件中的其余字段不起作用。

编辑:

在评论中,您说要标记事件为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"
编辑结束

似乎您希望该标志在有单个问题的用户的所有行中显示问题。为此:

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"
这将仅标记差异>=45的行中的用户:


不确定这是最好的示例数据帧。一个用户可以有多个请求吗?你能提供一个更好的例子吗?不,我只需要在它超过45时标记它。我们能接受最新的请求吗?你认为如果我加上日期会有帮助吗?嗨。如果df[diff]>=45,event==request only,我该怎么做?@vasiop我在脚本中将diff Days的名称改为diff,因为我不喜欢使用空格。如果您只想在差异天数正好为45时显示问题,那么将第二行更改为:users\u with_45=df.loc[df[Diff Days]==45,user]。这就是你的意思吗?我怎么能在不同的天数>=45天和事件等于要求的情况下做到这一点?哦!好的:有问题的用户\u=df.loc[df[event]==request&df[Diff Days]>=45,user]。我会在我的答案中编辑这个。超级感谢你,上帝保佑你,谢谢。多亏了你,我找到了正确的语法。df[Flag]=无问题df.loc[df[Diff Days]>=45&df[event]==请求,标志]=问题df
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