在带有项目数据(输入表(的熊猫数据帧中,我正在尝试计算每行"成功"的历史平均值。条件是:
- 仅考虑与计算行中具有相同"客户"的项目
- 仅考虑计算行中"结束日期"早于项目"开始日期"的项目
- 如果没有项目已经以特定客户结束,则应返回空白
非常感谢任何帮助,因为我不知道从哪里开始。谢谢。
输入表
Project ID Start Date End Date Success Customer Name
8403986 3/13/2015 9/9/2015 0.396 ENGINEERING INC
92083597 6/20/2016 12/24/2016 0.3 ENGINEERING INC
13979865 3/18/2019 5/5/2019 0.2004 ENGINEERING INC
93106418 1/22/2017 11/6/2017 0.374 MANAGEMENT CORP
3658851 8/5/2018 12/17/2018 0.5002 SERVICES INC
116547576 10/31/2015 12/30/2015 0.478 MANAGEMENT CORP
4164070 10/2/2018 10/12/2018 0.5 ENGINEERING INC
49701600 12/23/2017 10/1/2018 0.226 MANAGEMENT CORP
6235002 9/27/2016 4/25/2017 0.542 MANAGEMENT CORP
54113980 10/27/2015 1/2/2016 0.344 ENGINEERING INC
104596325 7/3/2015 2/17/2016 0.455 MANAGEMENT CORP
69580391 8/9/2016 1/10/2017 0.39 ENGINEERING INC
111382294 1/13/2017 10/18/2017 0.299 SERVICES INC
7904360 12/12/2015 3/16/2016 0.281 MANAGEMENT CORP
117003225 5/5/2017 5/12/2017 0.2868 SERVICES INC
99819795 10/9/2015 1/14/2016 0.356 ENGINEERING INC
122919691 1/16/2016 10/24/2016 0.474 SERVICES INC
输出表
Project ID Start Date End Date Success Customer Name Historic Success
8403986 3/13/2015 9/9/2015 0.396 ENGINEERING INC
92083597 6/20/2016 12/24/2016 0.3 ENGINEERING INC 0.365
13979865 3/18/2019 5/5/2019 0.2004 ENGINEERING INC 0.381
93106418 1/22/2017 11/6/2017 0.374 MANAGEMENT CORP 0.405
3658851 8/5/2018 12/17/2018 0.5002 SERVICES INC 0.353
116547576 10/31/2015 12/30/2015 0.478 MANAGEMENT CORP
4164070 10/2/2018 10/12/2018 0.5 ENGINEERING INC 0.357
49701600 12/23/2017 10/1/2018 0.226 MANAGEMENT CORP 0.439
6235002 9/27/2016 4/25/2017 0.542 MANAGEMENT CORP 0.405
54113980 10/27/2015 1/2/2016 0.344 ENGINEERING INC 0.396
104596325 7/3/2015 2/17/2016 0.455 MANAGEMENT CORP
69580391 8/9/2016 1/10/2017 0.39 ENGINEERING INC 0.365
111382294 1/13/2017 10/18/2017 0.299 SERVICES INC 0.474
7904360 12/12/2015 3/16/2016 0.281 MANAGEMENT CORP
117003225 5/5/2017 5/12/2017 0.2868 SERVICES INC 0.474
99819795 10/9/2015 1/14/2016 0.356 ENGINEERING INC 0.396
122919691 1/16/2016 10/24/2016 0.474 SERVICES INC
例如,项目"92083597"与"工程公司"和"开始日期"= 6/20/2016
条件 1:仅考虑"客户"= 工程 INC 的行
Project ID Start Date End Date Success Customer Name
8403986 3/13/2015 9/9/2015 0.396 ENGINEERING INC
92083597 6/20/2016 12/24/2016 0.3 ENGINEERING INC
13979865 3/18/2019 5/5/2019 0.2004 ENGINEERING INC
4164070 10/2/2018 10/12/2018 0.5 ENGINEERING INC
54113980 10/27/2015 1/2/2016 0.344 ENGINEERING INC
69580391 8/9/2016 1/10/2017 0.39 ENGINEERING INC
99819795 10/9/2015 1/14/2016 0.356 ENGINEERING INC
条件 2:仅考虑"结束日期"早于 2016 年 6 月 20 日的行
Project ID Start Date End Date Success Customer Name
8403986 3/13/2015 9/9/2015 0.396 ENGINEERING INC
54113980 10/27/2015 1/2/2016 0.344 ENGINEERING INC
99819795 10/9/2015 1/14/2016 0.356 ENGINEERING INC
其余三行 (0.369+0.344+0.356(/3 的平均值为0.365。 这将返回,并且是行项目"92083597"的"历史性成功"。 如果在返回第一个或第二个条件后没有留下任何项目,则为空。
如果你真的想学习如何解决它,你应该把这个问题分解成多个子问题。它将帮助您成为一名出色的程序员,并允许您获取各种堆栈溢出答案的零碎内容。此外,还应避免列名中有空格
这是我的做法,但可能有更快的方法来做到这一点
首先,应按日期对数据帧进行排序,确保数据的格式正确。您可以使用下面的代码来帮助确保它正确排序。它首先确保列的格式正确,然后根据Customer_Name排序以将它们分组在一起,然后根据日期进行排序以组织项目
df['End_Date'] =pd.to_datetime(df["End_Date"])
df = df.sort_values(["Customer_Name", "End_Date"])
然后根据之前的成功率计算每家公司的平均值。为此,您必须计算熊猫的运行平均值。这可以通过使用循环来完成,但在 Pandas 中通常有一种更快的方法来做到这一点。
df.groupby("Customer_Name").Success.expanding().mean()
这将生成每个Customer_Name日期顺序的运行平均值。完整的代码如下。您应该尝试查看我创建的每个子问题,看看是否可以使解决方案更好,或者添加更多您可能需要的子问题。
df['End_Date'] =pd.to_datetime(df["End_Date"])
df = df.sort_values(["Customer_Name", "End_Date"])
df["Historic_Success"] = df.groupby("Customer_Name")
.Success
.expanding()
.mean()
.values
希望能回答你的问题。如果要将数据帧排序回原来的格式,可以按索引排序,因为我尚未在代码中重新索引数据帧。
编辑: 为了避免历史成功率中出现第一个成功率,您可以在扩展函数中添加输入"2"。
df["Historic_Success"] = df.groupby("Customer_Name")
.Success
.expanding(2)
.mean()
.values
但这仍然包括当前项目的成功率。这意味着项目 1 的历史成功率将是项目 1 和项目 2 成功率的平均值。
为了避免这种情况,您应该使用以下代码。
df["Historic_Success"] = df.groupby("Customer_Name").Success.shift(1)
df.Historic_Success = df.groupby("Customer_Name")
.Historic_Success
.expanding()
.mean()
.values
在这里,将数据组织成客户名称和日期后,将成功数据下移 1。然后,对移位的数据运行相同的代码行。