Pandas:查找数据框中每个元素的上次编辑日期

希望在下面正确地表达自己,因为这似乎是一个复杂的问题。


我的部门定期在随机时间为我们当前的项目组合网站创建每日快照。下面,我过滤了整个表中所有项目 ID = 1 的快照。这里过滤是为了使其更容易理解,因为有很多项目。此外,我还减少了本示例的列数。


df_表


project_id  project_name  region  style   effect   representative lazy  timestamp

1           PullPressure  EU      A-B-C   Pull     Martin         DCA   10/01/20

1           PullPressure  EU      A-B-C   Pull     Martin         DCA   09/05/20

1           PushPressure  EU      A-B-C   Push     Martin               08/20/20

1           PressurePush  EU      A-B-C   Push     Martin               04/06/20

1           PressurePush  US      A-B-C   Push     Johnsson             12/31/19

1           PressurePush  US      A-B-C   Push     Johnsson             10/15/19

我的目标是找出project_id 的任何列(或通常任何key_column)的最后一次更改发生的时间,即给定id 的每个单元格最后一次编辑的时间是什么时候?


我的目标是实现这样的目标:


df_表_新:


project_id  project_name region       style        effect       representative  lazy        timestamp

1           08/20/20     04/06/20     10/15/19     09/05/20     04/06/20        09/05/20    10/01/20

1           08/20/20     04/06/20     10/15/19     09/05/20     04/06/20        09/05/20    09/05/20

1           08/20/20     04/06/20     10/15/19     10/15/19     04/06/20        10/15/19    08/20/20

1           10/15/19     04/06/20     10/15/19     10/15/19     04/06/20        10/15/19    04/06/20

1           10/15/19     10/15/19     10/15/19     10/15/19     10/15/19        10/15/19    12/31/19

1           10/15/19     10/15/19     10/15/19     10/15/19     10/15/19        10/15/19    10/15/19

如果有任何不清楚的地方,请告诉我!


编辑:列中包含空值会导致 NaT 错误,如下所示:


lazy

09/05/20

09/05/20

NaT

NaT

NaT

NaT

然而,字段应引用时间戳列中最早的可用时间戳(而不是 NaT),即 10/15/19。


edit2:通过将相应的元素添加到函数中来解决@jezrael的解决方案。非常感谢!


拉风的咖菲猫
浏览 79回答 1
1回答

温温酱

对由 生成的每一列使用GroupBy.transformwith :GroupBy.lastIndex.differencedf['timestamp'] = pd.to_datetime(df['timestamp'], format='%m/%d/%y')for c in df.columns.difference(['project_id','timestamp']):    df[c] = df.groupby(['project_id',c], sort=False)['timestamp'].transform('last')print (df)   project_id project_name     region      style     effect representative  \0           1   2020-09-05 2020-04-06 2019-10-15 2020-09-05     2020-04-06   1           1   2020-09-05 2020-04-06 2019-10-15 2020-09-05     2020-04-06   2           1   2020-08-20 2020-04-06 2019-10-15 2019-10-15     2020-04-06   3           1   2019-10-15 2020-04-06 2019-10-15 2019-10-15     2020-04-06   4           1   2019-10-15 2019-10-15 2019-10-15 2019-10-15     2019-10-15   5           1   2019-10-15 2019-10-15 2019-10-15 2019-10-15     2019-10-15      timestamp  0 2020-10-01  1 2020-09-05  2 2020-08-20  3 2020-04-06  4 2019-12-31  如果需要原始格式添加Series.dt.strftime:df['timestamp'] = pd.to_datetime(df['timestamp'], format='%m/%d/%y')for c in df.columns.difference(['project_id','timestamp']):    df[c] = (df.groupby(['project_id',c], sort=False)['timestamp'].transform('last')               .dt.strftime('%m/%d/%y'))print (df)   project_id project_name    region     style    effect representative  \0           1     09/05/20  04/06/20  10/15/19  09/05/20       04/06/20   1           1     09/05/20  04/06/20  10/15/19  09/05/20       04/06/20   2           1     08/20/20  04/06/20  10/15/19  10/15/19       04/06/20   3           1     10/15/19  04/06/20  10/15/19  10/15/19       04/06/20   4           1     10/15/19  10/15/19  10/15/19  10/15/19       10/15/19   5           1     10/15/19  10/15/19  10/15/19  10/15/19       10/15/19      timestamp  0 2020-10-01  1 2020-09-05  2 2020-08-20  3 2020-04-06  4 2019-12-31  5 2019-10-15  编辑:fillna按最小时间戳添加:df['timestamp'] = pd.to_datetime(df['timestamp'], format='%m/%d/%y')min1 = df['timestamp'].min()for c in df.columns.difference(['project_id','timestamp']):    df[c] = df.groupby(['project_id',c], sort=False)['timestamp'].transform('last').fillna(min1)print (df)   project_id project_name     region      style     effect representative  \0           1   2020-09-05 2020-04-06 2019-10-15 2020-09-05     2020-04-06   1           1   2020-09-05 2020-04-06 2019-10-15 2020-09-05     2020-04-06   2           1   2020-08-20 2020-04-06 2019-10-15 2019-10-15     2020-04-06   3           1   2019-10-15 2020-04-06 2019-10-15 2019-10-15     2020-04-06   4           1   2019-10-15 2019-10-15 2019-10-15 2019-10-15     2019-10-15   5           1   2019-10-15 2019-10-15 2019-10-15 2019-10-15     2019-10-15           lazy  timestamp  0 2020-09-05 2020-10-01  1 2020-09-05 2020-09-05  2 2019-10-15 2020-08-20  3 2019-10-15 2020-04-06  4 2019-10-15 2019-12-31  5 2019-10-15 2019-10-15  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python