Pandas groupby基于来自另一列的条件

问题描述 投票:0回答:2

我有一个df,例如下面的示例,我希望确定在给定时间段内发送相同文本的用户,例如<= 60分钟:

user = [1,2,3,4,5,6]
text = ['hello','hello','whats up','not now','not now','hello']
times = ['2010-09-14 16:51:00','2010-09-14 15:59:00',
        '2010-09-14 15:14:00','2010-09-14 14:55:00','2010-09-14 15:47:00','2010-09-14 15:29:00']

df = pd.DataFrame({'userid':user,'message':text,'time':times})

我当前的方法是按向每个文本发送消息的用户列表对文本进行分组:

group = df.groupby('message')['userid'].apply(list)

然后,我从每个列表中以对值数组的形式返回用户ID的所有可能组合,然后检索每个实例的用户ID文本作为用于从原始df中检索每个对的每个消息的时间的键。

此方法有效,但是我一直在尝试寻找更好的方法,根据每个实例之间的时间是否小于指定的时间段(例如本示例为60分钟),根据条件对每个不同文本的用户进行分组来自用户的两条消息之间的差异。因此,用户1和2的“ hello”相距不到60分钟,因此通过条件并将其添加到“ hello”列表中。

因此,该示例的预期输出将是:

       userid
"hello" [1,2]
"not not" [4,5]

Userid 1和2在一个小时内都向您问好,但1和6以及2和6在相距60分钟以上就向您好了。对于“不是现在”,只有两个用户发送此消息,并且消息彼此之间的间隔为60分钟。顺序不是太重要,因此解决方案可以测试所有可能的对([1,2],[1,6],[2.6]等。)

通常将消息字符串换成唯一的数字键,这样就不必只是熊猫解决方案-多个用户发送了大约100万条不同消息,因此当前解决方案似乎不适合该任务。

我还没有找到任何确切或类似的解决方案,因此我们非常感谢您的帮助。可能是我解决问题的方法是错误的!

我有一个df,例如下面的示例,我正在寻找标识在给定时间段内发送相同文本的用户,例如<= 60分钟:user = [1,2,3,4,5 ,6]文字= ['...

python pandas numpy dataframe pandas-groupby
2个回答
0
投票

[一种选择是使用groupby按时间顺序查找下一条匹配的消息,将其merge到原始数据帧,然后过滤到消息间隔小于1小时的内容:


0
投票

[不确定这是最优雅的解决方案-但这是使用group-byrolling的解决方案。这种方法的优点是它可以处理大量数据。它不会创建发送相同消息的所有用户和时间的完整笛卡尔乘积。

© www.soinside.com 2019 - 2024. All rights reserved.