【问题标题】:How to get specific rows on conditions?如何根据条件获取特定行?
【发布时间】:2023-03-05 11:22:01
【问题描述】:

数据如下:

Name      Stage           Start                 End

Hulk        1      21/10/2018 06:34:15    21/10/2018 07:34:15
Hulk        2      21/10/2018 07:34:15    21/10/2018 07:54:15
Hulk        3      21/10/2018 07:58:15    21/10/2018 08:14:15
Hulk        4      21/10/2018 08:14:15    21/10/2018 08:34:15
Sam         A1     21/10/2018 09:34:15    21/10/2018 10:34:15
Sam         A2     21/10/2018 10:34:15    21/10/2018 10:45:15
Sam         A3     21/10/2018 10:45:15    21/10/2018 11:00:15
Sam         A4     21/10/2018 11:00:15    21/10/2018 11:34:15
Bruce       1.1    21/10/2018 11:34:15    21/10/2018 11:45:15
Bruce       1.2    21/10/2018 11:45:15    21/10/2018 12:00:15
Bruce       1.3    21/10/2018 12:00:15    21/10/2018 12:25:15
Bruce       1.4    21/10/2018 12:25:15    21/10/2018 12:45:15
Peter        1     21/10/2018 12:45:15    21/10/2018 01:05:15
Peter        1     21/10/2018 01:05:15    21/10/2018 01:15:15

我怎样才能为每个Name 拥有firstlastStage 实例,其中以1 开头并以4 持续?

数据框应采用以下方式:

Name      Stage           Start                 End

Hulk        1      21/10/2018 06:34:15    21/10/2018 07:34:15
Hulk        4      21/10/2018 08:14:15    21/10/2018 08:34:15
Sam         A1     21/10/2018 09:34:15    21/10/2018 10:34:15
Sam         A4     21/10/2018 11:00:15    21/10/2018 11:34:15
Bruce       1.1    21/10/2018 11:34:15    21/10/2018 11:45:15
Bruce       1.4    21/10/2018 12:25:15    21/10/2018 12:45:15

我尝试了groupby([Name,Stage]),但没有得到上述所需的数据帧。

【问题讨论】:

    标签: python-2.7 pandas dataframe row slice


    【解决方案1】:

    使用duplicatedstr.containsboolean indexing 先返回必要的行,然后使用value_countsmap 过滤2 个行组:

    m1 = ~df['Name'].duplicated()
    m2 = df['Stage'].str.contains('1')
    
    m3 = ~df['Name'].duplicated(keep='last')
    m4 = df['Stage'].str.contains('4')
    
    df1 = df[(m1 & m2) | (m3 & m4)].copy()
    
    df1 = df1[df1['Name'].map(df1['Name'].value_counts()) == 2]
    print (df1)
         Name Stage                Start                  End
    0    Hulk     1  21/10/2018 06:34:15  21/10/2018 07:34:15
    3    Hulk     4  21/10/2018 08:14:15  21/10/2018 08:34:15
    4     Sam    A1  21/10/2018 09:34:15  21/10/2018 10:34:15
    7     Sam    A4  21/10/2018 11:00:15  21/10/2018 11:34:15
    8   Bruce   1.1  21/10/2018 11:34:15  21/10/2018 11:45:15
    11  Bruce   1.4  21/10/2018 12:25:15  21/10/2018 12:45:15
    

    【讨论】:

    • @RavinderSingh13 - 使用 df = pd.read_clipboard(sep='\s{2,}') - 分隔符是正则表达式 2 个或更多空格
    • 感谢 TON 先生,它帮助了我。你太棒了。
    • @jezrael 感谢 jezrael 的可爱解决方案,真的很佩服你的概念力量:)
    猜你喜欢
    • 2019-12-12
    • 2021-05-25
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2012-12-08
    • 2019-08-25
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多