我有一个具有以下 struct 的数据帧(df):

retweet_datetime tweet_id tweet_datetime
2020-04-24 03:33:15 85053699 2020-04-24 02:28:22
2020-04-24 02:43:35 85053699 2020-04-24 02:28:22
2020-04-18 04:24:03 86095361 2020-04-18 00:06:01
2020-04-18 00:19:08 86095361 2020-04-18 00:06:01
2020-04-18 00:18:38 86095361 2020-04-18 00:06:01
2020-04-18 00:07:08 86095361 2020-04-18 00:06:01

retweet\u datetime按最新的retweet排序.

我想创建两个新列,如下所示:

  1. tweet_lifetime1:last retweet time和first retweet time之间的差异,即对于每个tweet\u id:last retweet\u datetime-first retweet\u datetime
  2. tweet_lifetime2:最后一次转发时间和推特创建时间之间的差异(tweet_datetime)

更新1:

例如,对于推特id:"86095361":

  • tweet_lifetime1 = 2020-04-18 04:24:03 - 2020-04-18 00:07:08 (04:16:55)
  • tweet_lifetime2 = 2020-04-18 04:24:03 - 2020-04-18 00:06:01 (04:18:02)

预期输出df:

retweet_datetime tweet_id tweet_datetime lifetime1 lifetime2
2020-04-24 03:33:15 85053699 2020-04-24 02:28:22 00:49:40 01:04:53
2020-04-18 04:24:03 86095361 2020-04-18 00:06:01 04:16:55 04:18:02

我看到过几个类似的帖子,但它们大多是减go 连续的行.

df2 = df.assign(delta = df.groupby('tweet_id')['retweet_datetime'].diff())

有人能帮我吗?

非常感谢.

答案:

jezrael和Shubham的回答都很完美.我希望我能接受这两个答案.

推荐答案

使用named aggregationSeries.sub的减法列,DataFrame.pop用于处理后的下降列tmp:

df1 = (df.groupby('tweet_id', as_index=False)
         .agg(retweet_datetime=('retweet_datetime','first'),
              tmp = ('retweet_datetime','last'),
              tweet_datetime = ('tweet_datetime','last')))

df1['lifetime1'] = df1['retweet_datetime'].sub(df1.pop('tmp'))
df1['lifetime2'] = df1['retweet_datetime'].sub(df1['tweet_datetime'])
print (df1)
   tweet_id    retweet_datetime      tweet_datetime       lifetime1  \
0  85053699 2020-04-24 03:33:15 2020-04-24 02:28:22 0 days 00:49:40   
1  86095361 2020-04-18 04:24:03 2020-04-18 00:06:01 0 days 04:16:55   

        lifetime2  
0 0 days 01:04:53  
1 0 days 04:18:02  

如果需要格式HH:MM:SS,请使用:

def f(x):
    ts = x.total_seconds()
    hours, remainder = divmod(ts, 3600)
    minutes, seconds = divmod(remainder, 60)
    return ('{:02d}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds))

df1['lifetime1'] = df1['retweet_datetime'].sub(df1.pop('tmp')).apply(f)
df1['lifetime2'] = df1['retweet_datetime'].sub(df1['tweet_datetime']).apply(f)
print (df1)
   tweet_id    retweet_datetime      tweet_datetime lifetime1 lifetime2
0  85053699 2020-04-24 03:33:15 2020-04-24 02:28:22  00:49:40  01:04:53
1  86095361 2020-04-18 04:24:03 2020-04-18 00:06:01  04:16:55  04:18:02

Python相关问答推荐

调查TensorFlow和PyTorch性能的差异

在Python中,如何才能/应该使用decorator 来实现函数多态性?

Pandas 群内滚动总和

如何观察cv2.erode()的中间过程?

Tkinter -控制调色板的位置

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

如何防止Plotly在输出到PDF时减少行中的点数?

如何计算两极打印机中 * 所有列 * 的出现次数?

处理(潜在)不断增长的任务队列的并行/并行方法

如何在polars(pythonapi)中解构嵌套 struct ?

在线条上绘制表面

NumPy中条件嵌套for循环的向量化

如何在表中添加重复的列?

如何在FastAPI中为我上传的json文件提供索引ID?

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

在Python中计算连续天数

如何使用使用来自其他列的值的公式更新一个rabrame列?

重置PD帧中的值

为什么调用函数的值和次数不同,递归在代码中是如何工作的?

交替字符串位置的正则表达式