我有以下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)
谢谢:)
答案 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