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

熊猫在寻找价值观

  •  0
  • TylerNG  · 技术社区  · 7 年前

    我有以下df:

    Id  Date    Value
    111 1/1/18  a
    111 1/3/18  a
    111 1/5/18  x 
    222 1/1/18  x
    222 1/2/18  y
    333 1/2/18  a
    333 1/3/18  x
    333 1/4/18  a
    333 1/5/18  a
    444 1/5/18  y
    555 1/2/18  a
    

    我想根据值字段包含字母“a”的日期添加2个新列。

    结果:

    Id  Value  StartDate  EndDate
    111 a      1/1/18     1/3/18
    222                              (this id does not contain a)
    333 a      1/4/18     1/5/18     (take the latest date contain a)
    444                              (this id does not contain a)
    555 a      1/2/18                (there's no ending date)
    

    谢谢:)

    3 回复  |  直到 7 年前
        1
  •  2
  •   BENY    7 年前

    只需根据需要重命名列

    df=df.groupby(['Value','Id']).tail(2)    
    df1=df.set_index(['Value','Id'])
    df1.set_index(df1.groupby(['Id','Value']).cumcount(),append=True).Date.unstack().unstack().stack(dropna=False)
    Out[914]: 
                    0       1
    Value Id                 
    a     111  1/1/18  1/3/18
          222    None    None
          333  1/4/18  1/5/18
          444    None    None
          555  1/2/18    None
    x     111  1/5/18    None
          222  1/1/18    None
          333  1/3/18    None
          444    None    None
          555    None    None
    y     111    None    None
          222  1/2/18    None
          333    None    None
          444  1/5/18    None
          555    None    None
    
        2
  •  2
  •   ℕʘʘḆḽḘ    7 年前

    您可以轻松地执行以下操作

    df.loc[(df.Value== 'a') & (df.Id == 111), 'StartDate'] = '1/1/18'
    

    等等等等

        3
  •  2
  •   Vaishali    7 年前

    类似于文的,

    df['new'] = df[df['Value'] == 'a'].groupby('Id').Date.tail(2)
    df['new']=df.dropna().groupby('Id')['new'].cumcount()
    new_df = df.dropna().pivot('Id', 'new' , 'Date').rename(columns={0.0:'Start Date', 1.0: 'End Date'})
    
    
    new Start Date  End Date
    Id      
    111 1/1/18      1/3/18
    333 1/4/18      1/5/18
    555 1/2/18      None
    

    编辑:Id 555中有两个额外的行

        Id  Date    Value
    0   111 1/1/18  a
    1   111 1/3/18  a
    2   111 1/5/18  x
    3   222 1/1/18  x
    4   222 1/2/18  y
    5   333 1/2/18  a
    6   333 1/3/18  x
    7   333 1/4/18  a
    8   333 1/5/18  a
    9   444 1/5/18  y
    10  555 1/2/18  a
    11  555 1/3/18  a
    12  555 1/4/18  a
    

    上述解决方案将返回

    new Start Date  End Date
    Id      
    111 1/1/18      1/3/18
    333 1/4/18      1/5/18
    555 1/3/18      1/4/18