[英]Pandas - Groupby + Shift not working as expected
我有我试图执行一个DF groupby
和shift
上。 但是,输出不是我想要的。
我想将“下一个” DueDate
移到以前的日期。 因此,如果当前DueDate
为1/1,下一个DueDate
为6/30,则对于NextDueDate
DueDate==1/1
所有行,插入一个新列,其中NextDueDate
为6/30。 然后,当当前DueDate
为6/30时,然后为DueDate==6/30
6/30的所有行插入下一个DueDate
。
Original df
ID Document Date DueDate
1 ABC 1/31 1/1
1 ABC 2/28 1/1
1 ABC 3/31 1/1
1 ABC 4/30 6/30
1 ABC 5/31 6/30
1 ABC 6/30 7/31
1 ABC 7/31 7/31
1 ABC 8/31 9/30
Desired output df
ID Document Date DueDate NextDueDate
1 ABC 1/31 1/1 6/30
1 ABC 2/28 1/1 6/30
1 ABC 3/31 1/1 6/30
1 ABC 4/30 6/30 7/31
1 ABC 5/31 6/30 7/31
1 ABC 6/30 7/31 9/30
1 ABC 7/31 7/31 9/30
1 ABC 8/31 9/30 10/31
我在df['NextDueDate'] = df.groupby(['ID','Document'])['DueDate'].shift(-1)
但它并不df['NextDueDate'] = df.groupby(['ID','Document'])['DueDate'].shift(-1)
我真正了解我想要。
联合会
s=df.groupby('DueDate',as_index=False).size().to_frame('number').reset_index()
s.DueDate=s.DueDate.shift(-1).fillna('10/31')
s
Out[251]:
DueDate number
0 6/30 3
1 7/31 2
2 9/30 2
3 10/31 1
s.DueDate.repeat(s.number)
Out[252]:
0 6/30
0 6/30
0 6/30
1 7/31
1 7/31
2 9/30
2 9/30
3 10/31
Name: DueDate, dtype: object
df['Nextduedate']=s.DueDate.repeat(s.number).values
df
Out[254]:
ID Document Date DueDate Nextduedate
0 1 ABC 1/31 1/1 6/30
1 1 ABC 2/28 1/1 6/30
2 1 ABC 3/31 1/1 6/30
3 1 ABC 4/30 6/30 7/31
4 1 ABC 5/31 6/30 7/31
5 1 ABC 6/30 7/31 9/30
6 1 ABC 7/31 7/31 9/30
7 1 ABC 8/31 9/30 10/31
如果您有多个组:
l=[]
for _, df1 in df.groupby(["ID", "Document"]):
s = df1.groupby('DueDate', as_index=False).size().to_frame('number').reset_index()
s.DueDate = s.DueDate.shift(-1).fillna('10/31')
df1['Nextduedate'] = s.DueDate.repeat(s.number).values
l.append(df1)
New_df=pd.concat(l)
定义函数f
以根据更改后的日期执行替换-
def f(x):
i = x.drop_duplicates()
j = i.shift(-1).fillna('10/30')
return x.map(dict(zip(i, j)))
现在,调用这个函数里面groupby
+ apply
的ID
和Document
-
df['NextDueDate'] = df.groupby(['ID', 'Document']).DueDate.apply(f)
df
ID Document Date DueDate NextDueDate
0 1 ABC 1/31 1/1 6/30
1 1 ABC 2/28 1/1 6/30
2 1 ABC 3/31 1/1 6/30
3 1 ABC 4/30 6/30 7/31
4 1 ABC 5/31 6/30 7/31
5 1 ABC 6/30 7/31 9/30
6 1 ABC 7/31 7/31 9/30
7 1 ABC 8/31 9/30 10/30
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.