简体   繁体   English

如何加快这个计算?

[英]how to speed up this calculation?

i have a data set that looks like this:我有一个看起来像这样的数据集:

|.....userId.................|..cahtroomID....|..msg_index_in_chat..|..time_difference_between_msg..| |...userId.....|..cahtroomID..|..msg_index_in_chat..|..time_difference_between_msg..| |1234567891222222|sdfbsjkfdsdklf...|..............1.................|......0 hours 0 minutes....................| |1234567891222222|sdfbsjkfdsdklf...|................1................................|......0 小时 0分钟………………| |9876543112252141|sdfbsjkfdsdklf...|...............2................|......0 hours 4 minutes....................| |9876543112252141|sdfbsjkfdsdklf...|................2................|......0 小时 4分钟………………| |2374623982398939|quweioqewiieio|...............1................|......0 hours 0 minutes....................| |2374623982398939|quweioqewiieio|................1................|......0 小时 0 分钟.. ...................| |1234567891222222|quweioqewiieio|...............2................|......0 hours 4 minutes....................| |1234567891222222|quweioqewiieio|................2................|......0 小时 4 分钟.. ...................| |2374623982398939|quweioqewiieio|....................3...........|......1 hours 0 minutes....................| |2374623982398939|quweioqewiieio|..................3..........|......1 小时 0 分钟.. ...................|

I need to calculate the average time between messages in every room and assign the value I've gotten to every row.我需要计算每个房间中消息之间的平均时间,并将我得到的值分配给每一行。 To do so, I wrote this:为此,我写了这个:

 df['avg_time'] = 0
    for room in set(df.roomId):
        table = df[['msg_index_in_chat', 'time_difference_between_msg']][df.roomId == room]
        if len(table) > 1:
            avg_time = []
            times = table.time_difference_between_msg.tolist()
            avg_time = sum(times[1:], timedelta(0))/len(times[1:])
        elif len(table) ==1:
            avg_time = timedelta(hours = 0)
        df.loc[df.roomId == room,('avg_time')] = avg_time

the problem is that this code runs for a lot of time.问题是这段代码运行了长时间。 can you suggest a faster way for doing this calculation?你能建议一个更快的方法来做这个计算吗?

Thank you!谢谢!

Use GroupBy.transform with custom lambda function:GroupBy.transform与自定义 lambda 函数一起使用:

f = lambda times: sum(times.iloc[1:], pd.Timedelta(0))/len(times.iloc[1:]) if len(times) > 1 else pd.Timedelta(0)
df['avg_time'] = df.groupby('cahtroomID')['time_difference_between_msg'].transform(f)
print (df)
             userId      cahtroomID  msg_index_in_chat  \
0  1234567891222222  sdfbsjkfdsdklf                  1   
1  9876543112252141  sdfbsjkfdsdklf                  2   
2  2374623982398939  quweioqewiieio                  1   
3  1234567891222222  quweioqewiieio                  2   
4  2374623982398939  quweioqewiieio                  3   

  time_difference_between_msg avg_time  
0                    00:00:00 00:04:00  
1                    00:04:00 00:04:00  
2                    00:00:00 00:32:00  
3                    00:04:00 00:32:00  
4                    01:00:00 00:32:00  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM