【问题标题】:Flag first unique category within group in Pandas在 Pandas 中标记组内的第一个独特类别
【发布时间】:2023-02-21 20:44:33
【问题描述】:

问题

数据集

df = pd.DataFrame([['a','x'],['a','x'],['a','y'],['a','y'],['b','y'],['b','z'],['c','z']], columns = ['cat1', 'cat2'])

  cat1 cat2
0    a    x
1    a    x
2    a    y
3    a    y
4    b    y
5    b    z
6    c    z

我在网上尝试了很多东西,但似乎没有任何效果,有人可以帮忙吗!!

**输出要求:**

  cat1  cat2  flag
0    a    x    1
1    a    x    0
2    a    y    1
3    a    y    0
4    b    y    0
5    b    z    1
6    c    z    0

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用duplicated,反转布尔值(~)并转换为整数:

    df['flag'] = (~df['cat2'].duplicated()).astype(int)
    

    或者numpy.where

    df['flag'] = np.where(df['cat2'].duplicated(), 0, 1)
    

    输出:

      cat1 cat2  flag
    0    a    x     1
    1    a    x     0
    2    a    y     1
    3    a    y     0
    4    b    y     0
    5    b    z     1
    6    c    z     0
    

    【讨论】:

      【解决方案2】:

      DataFrame.duplicatednumpy.where 一起使用:

      df['flag'] = np.where(df.duplicated(['cat2']), 0, 1)
      print (df)
        cat1 cat2  flag
      0    a    x     1
      1    a    x     0
      2    a    y     1
      3    a    y     0
      4    b    y     0
      5    b    z     1
      6    c    z     0
      

      如果每组需要第一个值 cat1 输出是不同的:

      df['flag'] = np.where(df.duplicated(['cat1','cat2']), 0, 1)
      print (df)
        cat1 cat2  flag
      0    a    x     1
      1    a    x     0
      2    a    y     1
      3    a    y     0
      4    b    y     1
      5    b    z     1
      6    c    z     1
      

      编辑:使用您的数据:

      #if necessary first sorted value per claim and Date
      df['Date'] = pd.to_datetime(df['Date'])
      
      df = df.sort_values(['claim','Date'])
      
      df['flag'] = np.where(df.duplicated(['claim']), 0, 1)
      print (df)
        claim       Date  flag
      0     a 2001-05-01     1
      1     a 2002-08-01     0
      2     b 2005-09-08     1
      3     b 2009-09-08     0
      4     b 2020-10-01     0
      

      如果每个组需要第一个最小日期时间,请使用:

      print (df)
        claim        Date
      0     a  05/01/2001
      1     a  08/01/2002
      2     b  09/08/2005
      3     b  10/01/2020
      4     b  09/04/2000
      5     b  09/04/2000
      
      df['Date'] = pd.to_datetime(df['Date'])
      
      df['flag'] = np.where(df.index.isin(df.groupby('claim')['Date'].idxmin()), 1, 0)
      

      或者:

      df['Date'] = pd.to_datetime(df['Date'])
      
      df['flag'] = np.where(df['Date'].isin(df.groupby('claim')['Date'].transform('min')) &
                            ~df.duplicated(['claim','Date']), 1, 0)
      print (df)
        claim       Date  flag
      0     a 2001-05-01     1
      1     a 2002-08-01     0
      2     b 2005-09-08     0
      3     b 2020-10-01     0
      4     b 2000-09-04     1
      5     b 2000-09-04     0
      

      【讨论】:

      • 基本上我想要的是:cat1 cat2 flag claim Date flag 0 a 05/01/2001 1 1 a 08/01/2002 0 2 b 09/08/2005 1 3 b 09/08/2009 0 4 b 10/01/ 2020 0 索赔的第一个日期(升序)应标记为 1
      • @RaghavJain - 解决方案有问题吗?我尝试了您的数据并且运行良好。补充回答。
      • 效果很好。非常感谢!
      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2012-10-21
      • 1970-01-01
      • 2018-02-03
      • 2019-05-17
      • 2018-11-28
      相关资源
      最近更新 更多