如何在现有列的基础上添加新列

时间:2018-09-10 06:56:02

标签: python python-2.7 pandas

我有这样的dataframe

   id1         id2          Entry_Date
0  5344265358   55111095504 2018-07-13 00:00:00
1  5344265358   55111095504 2018-07-13 00:00:00
2  5344265358   55111095501 2018-08-13 00:00:00
3  5344265358   55111095502 2018-07-14 00:00:00
4  5441440119   55111366675 2018-08-13 00:00:00
5  5441440119   55111366676 2018-08-20 00:00:00
6  5441440119   55111366677 2018-09-21 00:00:00
7  5441440119   55111366677 2018-09-21 00:00:00

我想在现有列的基础上添加新列

我想按id1id2分组,然后根据日期排序,然后将下一组的日期分配给上一组,但是如您所见,数据具有重复性

     id1           id2          Entry_Date          Next_Date
0  5344265358   55111095504 2018-07-13 00:00:00 2018-07-14 00:00:00
1   5344265358  55111095504 2018-07-13 00:00:00 2018-07-14 00:00:00
2  5344265358   55111095501 2018-08-13 00:00:00 NAN
3  5344265358   55111095502 2018-07-14 00:00:00 2018-08-13 00:00:00 
4  5441440119   55111366675 2018-08-13 00:00:00 2018-08-20 00:00:00
5  5441440119   55111366676 2018-08-20 00:00:00 2018-09-21 00:00:00
6  5441440119   55111366677 2018-09-21 00:00:00 NAN
7  5441440119   55111366677 2018-09-21 00:00:00 NAN

1 个答案:

答案 0 :(得分:1)

我认为需要:

df['Entry_Date'] = pd.to_datetime(df['Entry_Date'])

df1 = (df.sort_values('Entry_Date')
         .drop_duplicates(['id1','id2'])
        .rename(columns={'Entry_Date':'Next_Date'}))
df1['Next_Date'] = df1['Next_Date'].shift(-1)
print (df1)
          id1          id2  Next_Date
0  5344265358  55111095504 2018-07-14
3  5344265358  55111095502 2018-08-13
2  5344265358  55111095501 2018-08-13
4  5441440119  55111366675 2018-08-20
5  5441440119  55111366676 2018-09-21
6  5441440119  55111366677        NaT

df = df.merge(df1, on=['id1','id2'], how='left')
print (df)
          id1          id2 Entry_Date  Next_Date
0  5344265358  55111095504 2018-07-13 2018-07-14
1  5344265358  55111095504 2018-07-13 2018-07-14
2  5344265358  55111095501 2018-08-13 2018-08-13
3  5344265358  55111095502 2018-07-14 2018-08-13
4  5441440119  55111366675 2018-08-13 2018-08-20
5  5441440119  55111366676 2018-08-20 2018-09-21
6  5441440119  55111366677 2018-09-21        NaT
7  5441440119  55111366677 2018-09-21        NaT