Groupby 过滤器,基于连续序列排序以及 ID 和日期列

2024-04-10

我有一个数据框,如下所示

    ID  Status  Date    
0   1   F   2017-06-22  
1   1   M   2017-07-22  
2   1   P   2017-10-22  
3   1   F   2018-06-22 
4   1   P   2018-08-22  
5   1   F   2018-10-22  
6   1   F   2019-03-22  
7   2   M   2017-06-29 
8   2   F   2017-09-29 
9   2   F   2018-01-29  
10  2   M   2018-03-29 
11  2   P   2018-08-29  
12  2   M   2018-10-29  
13  2   F   2018-12-29  
14  3   M   2017-03-20  
15  3   F   2018-06-20  
16  3   P   2018-08-20  
17  3   M   2018-10-20  
18  3   F   2018-11-20  
19  3   P   2018-12-20  
20  3   F   2019-03-20  
22  4   M   2017-08-10  
23  4   F   2018-06-10  
24  4   P   2018-08-10  
25  4   F   2018-12-10  
26  4   M   2019-01-10  
27  4   F   2019-06-10  
31  7   M   2017-08-10  
32  7   F   2018-04-10  
33  7   P   2018-08-10  
34  7   F   2018-11-10  
33  7   P   2019-08-10  
34  7   F   2019-10-10   

我想为每个 ID 将上述数据帧过滤为连续的 F-P-F 或 F-P-F-P-F 等。

经过上述步骤后,现在我们的数据框如下所示。

    ID  Status  Date      
3   1   F   2018-06-22 
4   1   P   2018-08-22  
5   1   F   2018-10-22   
18  3   F   2018-11-20  
19  3   P   2018-12-20  
20  3   F   2019-03-20   
23  4   F   2018-06-10  
24  4   P   2018-08-10  
25  4   F   2018-12-10    
32  7   F   2018-04-10  
33  7   P   2018-08-10  
34  7   F   2018-11-10
35  7   P   2019-08-10  
36  7   F   2019-10-10   

然后根据上面的数据框计算持续时间列,如下所示。

df['Duration'] = df.groupby('ID')['Date'].diff().dt.days

    ID  Status  Date    Duration
0   1   F   2018-06-22  nan
1   1   P   2018-08-22  61.00
2   1   F   2018-10-22  61.00
3   3   F   2018-11-20  nan
4   3   P   2018-12-20  30.00
5   3   F   2019-03-20  90.00
6   4   F   2018-06-10  nan
7   4   P   2018-08-10  61.00
8   4   F   2018-12-10  122.00
9   7   F   2018-04-10  nan
10  7   P   2018-08-10  122.00
11  7   F   2018-11-10  92.00
12  7   P   2019-08-10  273.00
13  7   F   2019-10-10  61.00

从上面的 DF 我想准备下面的数据框。

所以最终的预期输出如下所示

ID   F-P_Duration  F-F_Duration  P-F_Duration
1    61            122           61
3    30            120           30
4    61            183           122
7_1  122           214           92
7_2  273           334           61

尝试这个:

import re
import pandas as pd
import numpy as np

df = pd.read_clipboard()
df['Date'] = pd.to_datetime(df['Date'])
print(df)

Output:

    ID Status       Date
0    1      F 2017-06-22
1    1      M 2017-07-22
2    1      P 2017-10-22
3    1      F 2018-06-22
4    1      P 2018-08-22
5    1      F 2018-10-22
6    1      F 2019-03-22
7    2      M 2017-06-29
8    2      F 2017-09-29
9    2      F 2018-01-29
10   2      M 2018-03-29
11   2      P 2018-08-29
12   2      M 2018-10-29
13   2      F 2018-12-29
14   3      M 2017-03-20
15   3      F 2018-06-20
16   3      P 2018-08-20
17   3      M 2018-10-20
18   3      F 2018-11-20
19   3      P 2018-12-20
20   3      F 2019-03-20
22   4      M 2017-08-10
23   4      F 2018-06-10
24   4      P 2018-08-10
25   4      F 2018-12-10
26   4      M 2019-01-10
27   4      F 2019-06-10
31   7      M 2017-08-10
32   7      F 2018-04-10
33   7      P 2018-08-10
34   7      F 2018-11-10
33   7      P 2019-08-10
34   7      F 2019-10-10

我的第一个技巧是使用正则表达式来查找较长字符串中子字符串的位置。 使用join,我构建一个字符串并在该字符串中查找模式。通过将较长的图案放在前面来定义图案。

pattern = "FPFPF|FPF"
def f(x):
    m = re.search(pattern, ''.join(x['Status']))
    return x[m.start():m.end()] if m else None
df1 = df.groupby('ID', group_keys=False).apply(f)
print(df1)

Output:

    ID Status       Date
3    1      F 2018-06-22
4    1      P 2018-08-22
5    1      F 2018-10-22
18   3      F 2018-11-20
19   3      P 2018-12-20
20   3      F 2019-03-20
23   4      F 2018-06-10
24   4      P 2018-08-10
25   4      F 2018-12-10
32   7      F 2018-04-10
33   7      P 2018-08-10
34   7      F 2018-11-10
33   7      P 2019-08-10
34   7      F 2019-10-10

计算持续时间

df1['Duration'] = df1.groupby('ID')['Date'].diff().dt.days
print(df1)

Output:

    ID Status       Date  Duration
3    1      F 2018-06-22       NaN
4    1      P 2018-08-22      61.0
5    1      F 2018-10-22      61.0
18   3      F 2018-11-20       NaN
19   3      P 2018-12-20      30.0
20   3      F 2019-03-20      90.0
23   4      F 2018-06-10       NaN
24   4      P 2018-08-10      61.0
25   4      F 2018-12-10     122.0
32   7      F 2018-04-10       NaN
33   7      P 2018-08-10     122.0
34   7      F 2018-11-10      92.0
33   7      P 2019-08-10     273.0
34   7      F 2019-10-10      61.0

使用最新的 pandas 0.25 进行聚合并进行聚合重新标记:

df_out = df1.groupby(['ID',(df1['Status'] != 'F').cumsum()])['Duration']\
            .agg(F_P_Duration = lambda x: x.iloc[0], 
                 F_F_Duration = 'sum').dropna()
print(df_out)

Output:

           F_P_Duration  F_F_Duration
ID Status                            
1  1               61.0         122.0
3  2               30.0         120.0
4  3               61.0         183.0
7  4              122.0         214.0
   5              273.0         334.0

Pandas 0.25 之前的更新...

df1.groupby(['ID',(df1['Status'] != 'F').cumsum()])['Duration']\
            .agg(['first', 'sum', 'last']).dropna()\
            .rename(columns={'first':'F_P_Duration',
                             'sum':'F_F_Duration',
                             'last':'P_F_Duration'})

Output:

           F_P_Duration  F_F_Duration  P_F_Duration
ID Status                                          
1  1               61.0         122.0          61.0
3  2               30.0         120.0          90.0
4  3               61.0         183.0         122.0
7  4              122.0         214.0          92.0
   5              273.0         334.0          61.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Groupby 过滤器,基于连续序列排序以及 ID 和日期列 的相关文章

随机推荐

  • 比较 data.table 的两行并仅显示有差异的列[重复]

    这个问题在这里已经有答案了 我得到了一个大的 data table 其中包含不同类型的列 例如数字或字符 例如 data table name c A A val1 c 1 2 val2 c 3 3 cat c u v name val1
  • 在 Apache POI 3.9 中,使用 autosizeColumn 同一列上的图像会被拉伸

    我在 Excel 工作表中有一张图像和图像下方的一些文本 当我将 autoSizeColumn 应用于文本呈现的列时 图像也会被拉伸 我还将锚类型设置为 2 但这并不能保护图像调整大小 我在这里发布一些示例代码 public static
  • Spark:JavaRDD 到 JavaPairRDD<>

    我有一个JavaRDD
  • 透明精灵表有黑色背景

    我正在使用 Python 和 Pygame 开发游戏 我为其中一个敌人创建了一个精灵表 并使其代码正常工作 问题是图像看起来有黑色背景 即使它是透明图像 它的代码是这样的 enemySheet pygame image load resou
  • 使用 selenium Java (Mac OSX) 将 Firefox 浏览器置于前端

    我正在使用三个火狐驱动程序实例进行自动化 我需要将当前活动的火狐浏览器置于前面 因为我正在使用一些机器人类进行某些操作 我曾在 mac 中尝试过针对 google chrome 的 java 脚本警报 相同的操作 并且工作正常 在 Wind
  • 在Android 4.2 API 17上读取Sqlite Cursor carsh

    我有一张桌子145行 当我尝试获取所有数据时crashed on android 4 2 BUT它工作得很好android 4 4 emulator public ArrayList
  • 为什么我不能得到与 GridSearchCV 相同的结果?

    GridSearchCV只返回每个参数化的分数 我还希望看到 Roc 曲线以更好地理解结果 为了做到这一点 我想采用性能最好的模型GridSearchCV并重现这些相同的结果 但缓存概率 这是我的代码 import numpy as np
  • 超低延迟硬实时多线程 x86 代码的意外周期性行为

    我正在具有 RT 优先级的专用 CPU 上循环运行代码以进行多次迭代 并希望长时间观察其行为 我发现代码有一个非常奇怪的周期性行为 简而言之 这就是代码的作用 Arraythread while 1 if flag Multiply mat
  • 通过透明 Windows 窗体防止鼠标点击

    我正在制作一个小工具 用于在浮动侧边栏中切换 笔 按钮后用鼠标在屏幕上绘图 我已经做到了这一点 请不要笑 方法是使用最顶层的窗口窗体及其背景 因为它的透明键覆盖整个屏幕 当我处于绘图模式时 我需要使鼠标不会点击表单到下面的内容上 我尝试按照
  • 如何搜索一长串 JavaScript 对象以查找“sent: 0”的第一个实例

    这里有一个主要的循环问题 我的数据如下所示 var mailouts signUp date sent 1 lesson1 sent 1 time 20 lesson2 sent 0 time 20 lesson3 sent 0 time
  • Haxe - 创建 C++ 独立可执行文件

    我编写了一个 haxe 程序 尝试与远程服务器进行通信 我能够成功编译到 C 目标 该可执行文件在我的系统上运行得很好 但是 当我尝试在另一个 Windows 盒子上运行相同的命令时 它失败并出现以下错误 错误 无法加载模块 std soc
  • 是否可以重新排序或忽略控制器路由中的参数?

    问题标题是我能想到的最明确的 但为了清楚起见 这里有一个用例 示例 假设我定义以下路线来显示一篇文章 Route get article slug id ArticleController show class ArticleControl
  • 如何实现向后兼容的soap webservice(基于java)?

    我们的产品之一使用合同最后方法发布网络服务 这已经成为一个真正的问题 因为一旦我们发布产品的新版本 我们所有的客户 ws 客户 都必须重建他们的客户端应用程序 这是由于所有名称空间更改都是自动生成的 wsdls 的成本 我们使用 Axis1
  • S3和EMR数据局部性[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 MapReduce 和 HDFS 的数据局部性非常重要 Spark HBase 也是如此 我一直在研究 AWS 以及在云中部署集群时的两个选项
  • JavaScript 丢失带有私有/公共属性的“this”对象引用

    我在运行以下页面时出现以下错误 this testpublic 不是一个函数 test function var testprivate function this testpublic this testpublic function c
  • 使用 Core Plot 和 Swift 绘制多个散点图

    我正在尝试找到一种方法将两个不同的散点图添加到单个图表中 但到目前为止我还无法做到 我在 Objective C 中找到了一些示例 但在 Swift 中没有找到任何示例 只有 CorePlot 2 1 版本中的 Scatterplot 示例
  • Android 上的 EditText 中只有文本吗?

    我只想在 Android 应用程序的 edittext 中输入文本 输入 例如 仅输入 文本 A gt Z 不允许输入数字或特殊字符 请给我一个想法 应该怎么做 非常感谢 试试这个方法 android digits abcdefghijkl
  • 模拟外部 API 以使用 Python 进行测试

    Context 我正在尝试为查询外部 API 的函数编写测试 这些函数向 API 发送请求 获取响应并处理它们 在我的测试中 我想使用本地运行的模拟服务器来模拟外部 API 到目前为止 模拟服务器已成功运行并响应自定义 GET 查询 问题
  • 如何垂直分割250k列的文件?

    我需要根据大小 首选 或列数将 250k 的文件拆分为几个 5 块 我知道split命令用于按行拆分 但不知道是否有类似的函数用于按列拆分 我的文件中的列数不均匀 因此块不能具有相同的列数 Input AA BB CC DD EE FF G
  • Groupby 过滤器,基于连续序列排序以及 ID 和日期列

    我有一个数据框 如下所示 ID Status Date 0 1 F 2017 06 22 1 1 M 2017 07 22 2 1 P 2017 10 22 3 1 F 2018 06 22 4 1 P 2018 08 22 5 1 F 2