为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2024-01-24 20:51:55
希望在下面正确地表达自己,因为这似乎是一个复杂的问题。我的部门定期在随机时间为我们当前的项目组合网站创建每日快照。下面,我过滤了整个表中所有项目 ID = 1 的快照。这里过滤是为了使其更容易理解,因为有很多项目。此外,我还减少了本示例的列数。df_表project_id  project_name  region  style   effect   representative lazy  timestamp1           PullPressure  EU      A-B-C   Pull     Martin         DCA   10/01/201           PullPressure  EU      A-B-C   Pull     Martin         DCA   09/05/201           PushPressure  EU      A-B-C   Push     Martin               08/20/201           PressurePush  EU      A-B-C   Push     Martin               04/06/201           PressurePush  US      A-B-C   Push     Johnsson             12/31/191           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        timestamp1           08/20/20     04/06/20     10/15/19     09/05/20     04/06/20        09/05/20    10/01/201           08/20/20     04/06/20     10/15/19     09/05/20     04/06/20        09/05/20    09/05/201           08/20/20     04/06/20     10/15/19     10/15/19     04/06/20        10/15/19    08/20/201           10/15/19     04/06/20     10/15/19     10/15/19     04/06/20        10/15/19    04/06/201           10/15/19     10/15/19     10/15/19     10/15/19     10/15/19        10/15/19    12/31/191           10/15/19     10/15/19     10/15/19     10/15/19     10/15/19        10/15/19    10/15/19如果有任何不清楚的地方,请告诉我!编辑:列中包含空值会导致 NaT 错误,如下所示:lazy09/05/2009/05/20NaTNaTNaTNaT然而,字段应引用时间戳列中最早的可用时间戳(而不是 NaT),即 10/15/19。edit2:通过将相应的元素添加到函数中来解决@jezrael的解决方案。非常感谢!
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

对由 生成的每一列使用GroupBy.transformwith :GroupBy.lastIndex.difference

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')

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  


查看完整回答
反对 回复 2024-01-24
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信