Python 利用Pandas确定最优群配置
我试图找出两个成员之间的重叠,看看他们是否认识对方。我也有一个最低限度的重叠要求(即他们需要相互了解至少两个月才能组成一个小组) 示例输入DFPython 利用Pandas确定最优群配置,python,pandas,Python,Pandas,我试图找出两个成员之间的重叠,看看他们是否认识对方。我也有一个最低限度的重叠要求(即他们需要相互了解至少两个月才能组成一个小组) 示例输入DF time_together = 5184000 (60 days) person_name start_date end_date cut_off (start + time_together) sally 1540627200 1545638400 1545811200 john 1543046400 1
time_together = 5184000 (60 days)
person_name start_date end_date cut_off (start + time_together)
sally 1540627200 1545638400 1545811200
john 1543046400 1548316800 1548230400
edgar 1548316800 1553414400 1553500800
我目前在pandas数据框中的unix时间戳中有开始日期和结束日期。我计算了一个截止时间,即开始时间+最小持续时间。然后,我根据截止日期检查每个人的出勤情况,如果低于我所说的人数,他们将组成一个有效的小组(见下面的代码)
因为莎莉和约翰在一起的时间最短。他们会组成一个小组,但埃德加没有
理想情况下,输出将是一个列表列表
[person1,person2,person5],[person3,person4]]
它的速度也很慢,所以任何关于如何加快速度的建议都是非常好的。我认为你正在努力实现的目标有很多,但可以分为两个步骤。(我不确定这是否是实现目标最有效的方式)
pairs = []
for i in range(len(test.index)):
for j in range(len(test.index)-i-1):
if (min(test.loc[i]['end_date'], test.loc[i+j+1]['end_date'])
- max(test.loc[i]['start_date'], test.loc[i+j+1]['start_date'])
>= (min_time_together)):
pairs.append([test.loc[i]['person_name'], test.loc[i+j+1]['person_name']])
这将生成输出:
[['Angelina', 'Estefana'],
['Na', 'Twyla'],
['Na', 'Wilfredo'],
['Twyla', 'Wilfredo']]
为了“浓缩”这一对的列表涉及到一系列的图论,老实说,我不是这方面的专家,但这里是一个相关StackOverflow问题的答案(非常有趣的主题和该页面上的许多好信息)。如果我们从列表列表中的答案中使用concurebk
函数,我们将得到以下最终输出:
#condenseBK(*pairs)
[['Angelina', 'Estefana'], ['Na', 'Twyla', 'Wilfredo']]
你能从
df
提供几行示例数据吗?当然!如上所述,您确定当前输出DF正确吗?莎莉和约翰只重叠了30天这真是个好办法!但我实际上是在试图避免O(n^2)运行时,因为我使用的是一个巨大的数据集,您有没有考虑过使用它?我认为您可以用O(n logn)这样的方式构建树,并用O(logn+匹配间隔数)查询它
pairs = []
for i in range(len(test.index)):
for j in range(len(test.index)-i-1):
if (min(test.loc[i]['end_date'], test.loc[i+j+1]['end_date'])
- max(test.loc[i]['start_date'], test.loc[i+j+1]['start_date'])
>= (min_time_together)):
pairs.append([test.loc[i]['person_name'], test.loc[i+j+1]['person_name']])
[['Angelina', 'Estefana'],
['Na', 'Twyla'],
['Na', 'Wilfredo'],
['Twyla', 'Wilfredo']]
#condenseBK(*pairs)
[['Angelina', 'Estefana'], ['Na', 'Twyla', 'Wilfredo']]