熊猫查找价值观

时间:2018-01-16 17:58:20

标签: python pandas lookup

我有以下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

我想根据Value字段包含字母" 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 个答案:

答案 0 :(得分:2)

您可以轻松地执行类似

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

依旧等等

答案 1 :(得分:2)

您只需要将列重命名为您需要的内容

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)

与@ Wen相似,

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