Pandas - 基于“下一行”值创建新列

4

我有以下的数据框:

   date      country   
   6/1/18    USA
   6/1/18    BEL
   6/4/18    USA
   6/5/18    BEL
   6/6/18    USA

我希望创建一列,告诉你相应国家的下一个日期是什么。如果有助于理解,可以假定日期已经排序。如果日期是该国最后一个日期,您可以使用相同的日期或空值填充下一个日期。

   date      country   next_date
   6/1/18    USA       6/4/18
   6/1/18    BEL       6/5/18
   6/4/18    USA       6/6/18
   6/5/18    BEL       6/5/18
   6/6/18    USA       6/6/18
2个回答

8
您可以使用groupbyshift来填充下一个可用值,但是这样会使行没有下一个可用日期而成为NaN
df.assign(ndate=df.groupby('country').date.shift(-1))

     date country   ndate
0  6/1/18     USA  6/4/18
1  6/1/18     BEL  6/5/18
2  6/4/18     USA  6/6/18
3  6/5/18     BEL     NaN
4  6/6/18     USA     NaN

如果您想要用最后一次查看的日期填写这些值,您只需使用 fillna 函数,并将其应用于您的 date 列:

df.assign(ndate=df.groupby('country').date.shift(-1)).fillna({'ndate': df.date})

     date country   ndate
0  6/1/18     USA  6/4/18
1  6/1/18     BEL  6/5/18
2  6/4/18     USA  6/6/18
3  6/5/18     BEL  6/5/18
4  6/6/18     USA  6/6/18

你改变了使用ffill()的第一个答案了吗? - JesusMonroe
是的,当ffilldate列使用相同的值时,实际上没有理由使用ffill - user3483203
明白了,那就谢谢了。 - JesusMonroe

2
您也可以使用 transform。我选择将最终日期留为空值(NaN)。
>>> df.assign(next_date=df.groupby('country')['date'].transform(
                  lambda group: group.shift(-1)))
     date country next_date
0  6/1/18     USA    6/4/18
1  6/1/18     BEL    6/5/18
2  6/4/18     USA    6/6/18
3  6/5/18     BEL       NaN
4  6/6/18     USA       NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接