【问题标题】:update rows and drop few rows in grouped data based on conditions根据条件更新行并删除分组数据中的几行
【发布时间】:2018-03-12 23:05:52
【问题描述】:

我有以下数据框,它有 4 列。让我们称之为 df。

    ID  Start transfer  Finish transfer Ward
0   7685933 04/11/2015 12:07    05/11/2015 12:49    General surgery
1   7685933 05/11/2015 12:49    11/11/2015 14:42    Anestesiology
2   7685933 11/11/2015 14:42    11/11/2015 16:12    Anestesiology
3   7685933 11/11/2015 16:12    18/11/2015 21:24    General surgery
4   7685933 18/11/2015 21:24    02/01/2016 06:45    ICU
5   7690142 06/11/2015 17:24    30/11/2015 18:11    Internal Medicine
6   7690142 30/11/2015 18:11    02/12/2015 17:04    Internal Medicine
7   7690142 02/12/2015 17:04    03/12/2015 20:40    Internal Medicine
8   7690142 03/12/2015 20:40    11/01/2016 18:00    Internal Medicine
9   7691888 08/11/2015 16:28    16/11/2015 17:11    Internal Medicine
10  7691888 16/11/2015 17:11    20/11/2015 18:13    Internal Medicine
11  7691888 20/11/2015 18:13    04/01/2016 18:02    Internal Medicine
12  7691888 04/01/2016 18:02    04/01/2016 21:13    Internal Medicine

现在我想根据“ID”列对数据进行分组,然后查找类似的连续病房,其中病房的“完成转移”与下一个连续类似病房名称的“开始转移”相同。一旦确定了这一点,我需要从最后一个连续病房行复制 Finish transfer 条目,并使用该值更新该特定病房的第一个条目。例如,索引 1 和 2 处的 row1 和 row2 都具有相似的病房,如果您查看 row1 (index1) 的 Finish Transfer 条目,它类似于 row2(index2) 的 Start Transfer。沃德也一样。我想要的是只有一行这个连续数据,其中开始传输是来自 row1 的数据,而完成传输是来自 row2。

我想要以下内容作为输出(可能在新数据框中):

    ID  Start transfer  Finish transfer Ward
0   7685933 04/11/2015 12:07    05/11/2015 12:49    General surgery
1   7685933 05/11/2015 12:49    11/11/2015 16:12    Anestesiology
2   7685933 11/11/2015 16:12    18/11/2015 21:24    General surgery
3   7685933 18/11/2015 21:24    02/01/2016 06:45    ICU
4   7690142 06/11/2015 17:24    11/01/2016 18:00    Internal Medicine
5   7691888 08/11/2015 16:28    04/01/2016 21:13    Internal Medicine

提前感谢您的帮助。

【问题讨论】:

  • 你已经描述了你想要什么,但没有描述你尝试这样做时出了什么问题,或者你克服这些问题的尝试是如何失败的。现在听起来你只是有一个规范,而不是一个问题。

标签: python pandas grouping


【解决方案1】:

IIUC

df.groupby(['ID','Ward']).agg({'Start transfer':'first','Finish transfer':'last'}).reset_index()
Out[151]: 
        ID               Ward    Start transfer   Finish transfer
0  7685933      Anestesiology  05/11/2015 12:49  11/11/2015 16:12
1  7685933    General surgery  04/11/2015 12:07  18/11/2015 21:24
2  7685933                ICU  18/11/2015 21:24  02/01/2016 06:45
3  7690142  Internal Medicine  06/11/2015 17:24  11/01/2016 18:00
4  7691888  Internal Medicine  08/11/2015 16:28  04/01/2016 21:13

更新

df.assign(Key=(df.Ward.shift()!=df.Ward).cumsum()).groupby(['ID','Ward','Key']).agg({'Start transfer':'first','Finish transfer':'last'}).reset_index().sort_values('Key')
Out[181]: 
        ID               Ward  Key    Start transfer   Finish transfer
1  7685933    General surgery    1  04/11/2015 12:07  05/11/2015 12:49
0  7685933      Anestesiology    2  05/11/2015 12:49  11/11/2015 16:12
2  7685933    General surgery    3  11/11/2015 16:12  18/11/2015 21:24
3  7685933                ICU    4  18/11/2015 21:24  02/01/2016 06:45
4  7690142  Internal Medicine    5  06/11/2015 17:24  11/01/2016 18:00
5  7691888  Internal Medicine    5  08/11/2015 16:28  04/01/2016 21:13

【讨论】:

  • 嗨 Wen,这一行代码似乎对大多数数据都运行良好,但如果您查看结果第 1 行(索引 1),现在合并了该特定 ID 的普通手术数据.但是,我应该有两个单独的普通手术条目,因为第一个条目的完成传输(我的数据的索引 0)与第 3 行的开始传输(索引 3)不同。有没有进一步的改进?
  • 你好文,我刚刚测试了更新代码,它运行良好。太谢谢了。只是为了理解的目的,你能解释一下代码中实际发生的事情,特别是在第一部分 df.assign(Key=(df.Ward.shift()!=df.Ward).cumsum( ))?还有一件小事。在实际数据集中,我有 22 列,但是当我运行您的代码并将结果保存到另一个数据框中时,我只有 5 列(类似于更新代码的结果)。有没有办法可以将来自实际数据帧其他列的数据保留在生成的新数据帧 df_new 中?
  • 我执行以下操作:df_new=df.assign(Key=(df.Ward.shift()!=df.Ward).cumsum()).groupby(['ID','Ward ','Key']).agg({'开始传输':'first','完成传输':'last'}).reset_index().sort_values('Key')
  • @HT121 df.assign(Key=(df.Ward.shift()!=df.Ward).cumsum()),这是记录Ward变化,如果变化count = count+1 ,那么我们就可以排除之前的代码错误结果了
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2021-07-18
  • 2022-10-14
  • 1970-01-01
  • 2022-08-02
  • 2018-03-03
相关资源
最近更新 更多