代码之家  ›  专栏  ›  技术社区  ›  toastienf

如何从分组数据创建标记最新日期的列

  •  0
  • toastienf  · 技术社区  · 4 年前

    我使用的数据框如下所示:

    身份证1 类型 名称 日期 标记 已更新的\u标记
    1. 防抱死制动系统 576 2009 最后的
    1. sqr 573 2020
    1. 享乐 234 2020
    1. 556 2020
    2. 防抱死制动系统 364 2015
    2. sqr 937 2019
    2. 享乐 562 2020 最后的
    2. 好啊 794 二千零二十一
    3. 防抱死制动系统 846 2012 最后的
    3. 享乐 540 2015
    3. sqr 276 2016
    3. 649 2017

    我正试图编写一个程序,用一个新的 Updated_Marked 在以下条件下,将正确显示“Last”的列:

    在每个 ID 1 分组,只查看带有 Type == "abs" | Type == "sqr" | Type == fun .在每组中,看最新的 Date 。如果“最后一次”已标记在最新日期旁边,请不要执行任何操作。如果“Last”不正确,更新新列,将“Last”放在最新的行中。如果“Last”不正确,并且多行被绑定为latest(相同的日期值),则在每个行旁边放置“multiple”。

    更新后的数据框如下所示:

    +------+------+------+------+--------+----------------+
    | ID 1 | Type | Name | Date | Marked | Updated_Marked |
    +------+------+------+------+--------+----------------+
    |    1 | abs  |  576 | 2009 | Last   |                |
    |    1 | sqr  |  573 | 2020 |        | Multiple       |
    |    1 | fun  |  234 | 2020 |        | Multiple       |
    |    1 | no   |  556 | 2020 |        |                |
    |    2 | abs  |  364 | 2015 |        |                |
    |    2 | sqr  |  937 | 2019 |        |                |
    |    2 | fun  |  562 | 2020 | Last   |                |
    |    2 | ok   |  794 | 2021 |        |                |
    |    3 | abs  |  846 | 2012 | Last   |                |
    |    3 | fun  |  540 | 2015 |        |                |
    |    3 | sqr  |  276 | 2016 |        | Last           |
    |    3 | no   |  649 | 2017 |        |                |
    +------+------+------+------+--------+----------------+
    

    如果有什么我能澄清的,请告诉我。

    1 回复  |  直到 4 年前
        1
  •  2
  •   enke    4 年前

    这里有一种使用3个口罩的方法。这样做的目的是识别必须更新的行,使用其类型、最新日期,以及是否标记为“Last”。然后,为这些行分配值 Updated_Marked 列行数取决于 ID 1 它与其他行共享

    msk1 = df['Type'].isin(['abs','sqr','fun'])
    msk2 = df['Date'] == df.groupby(['ID 1', msk1])['Date'].transform('max')
    msk3 = df['Marked'] != 'Last'
    df.loc[msk1 & msk2 & msk3, 'Updated_Marked'] = df[msk1 & msk2 & msk3].groupby('ID 1')['ID 1'].transform('count').gt(1).replace({True: 'Multiple', False: 'Last'})
    df = df.fillna('')
    

    输出:

        ID 1 Type  Name  Date Marked Updated_Marked
    0      1  abs   576  2009   Last               
    1      1  sqr   573  2020              Multiple
    2      1  fun   234  2020              Multiple
    3      1   no   556  2020                      
    4      2  abs   364  2015                      
    5      2  sqr   937  2019                      
    6      2  fun   562  2020   Last               
    7      2   ok   794  2021                      
    8      3  abs   846  2012   Last               
    9      3  fun   540  2015                      
    10     3  sqr   276  2016                  Last
    11     3   no   649  2017                      
    
    推荐文章