python - Pandas - Groupby + Shift 未按预期工作

标签 python pandas group-by pandas-groupby

我有一个 df,我正在尝试对其执行 groupbyshift 。但是,输出不是我想要的。

我想将“下一个”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)))

现在,在 IDDocument 上的 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/

相关文章:

python - Pandas 分组 : TOP 3 values in each group and store in DataFrame

python - Theano 测试文件无法编译

python - 时间戳相减必须具有相同时区或没有时区

python - 带有 AR 误差的线性回归模型 python

python - Pandas 将数据框的所有元素连接成一个系列

python - 包含 'flexible' 模式的子集字符串行

sql - 如何将别名添加到 group by 子句

python - Pandas:比较数据框中组内的行并创建摘要行以标记/突出显示组中的不同条目

连续日期的MySQL实现

mysql - 基于多个列返回重复行