我有一个 df,我正在尝试对其执行 groupby
和 shift
。但是,输出不是我想要的。
我想将“下一个”DueDate
移至之前的日期。因此,如果当前 DueDate
为 1/1,下一个 DueDate
为 6/30,则插入一个新列,其中 NextDueDate
为 6/30 对于 DueDate==1/1
的所有行。然后,当当前 DueDate
为 6/30 时,为 DueDate==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)
但它并没有完全让我到达我想要的地方。
最佳答案
定义一个函数f
来根据移位日期执行替换 -
def f(x):
i = x.drop_duplicates()
j = i.shift(-1).fillna('10/30')
return x.map(dict(zip(i, j)))
现在,在 ID
和 Document
上的 groupby
+ apply
内调用此函数 -
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
关于python - Pandas - Groupby + Shift 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082403/