创建所有机器的开始和结束时间的可能组合

Create a possible combination of start and end time of all machines

我有一个数据框 dt,如下所示。机器 M1 有三个可能的开始和结束时间,M2 和 M3 也有。

MID ST      ET
M1  11/7/2021 4:52  11/7/2021 6:22
M1  11/7/2021 6:22  11/7/2021 7:52
M1  11/7/2021 7:52  11/7/2021 9:22
M2  11/7/2021 4:54  11/7/2021 6:24
M2  11/7/2021 6:24  11/7/2021 7:54
M2  11/7/2021 7:54  11/7/2021 9:24
M3  11/7/2021 4:56  11/7/2021 6:26
M3  11/7/2021 6:26  11/7/2021 7:56
M3  11/7/2021 7:56  11/7/2021 9:26

我想以数据帧的形式为每台机器找到开始和结束时间的组合。就像我分别固定 M2 和 M3 的 ST 和 ET 的值并改变 M1 一样,只有三种可能的组合如下所示。我想要像 df 这样的数据框中的所有此类组合,每个组合都具有唯一 ID(包括上面对 M2 和 M3 的分析)。

Combination C1
MID ST      ET
M1  11/7/2021 4:52  11/7/2021 6:22
M2  11/7/2021 4:54  11/7/2021 6:24
M3  11/7/2021 4:56  11/7/2021 6:26      



Combination C2  

MID ST              ET
M1  11/7/2021 6:22  11/7/2021 7:52
M2  11/7/2021 4:54  11/7/2021 6:24
M3  11/7/2021 4:56  11/7/2021 6:26      

Combination C3
    
MID ST              ET
M1  11/7/2021 7:52  11/7/2021 9:22
M2  11/7/2021 4:54  11/7/2021 6:24
M3  11/7/2021 4:56  11/7/2021 6:26

Dataframe, df(最终数据框将是这个):

MID ST              ET              Cname
M1  11/7/2021 4:52  11/7/2021 6:22  C1
M2  11/7/2021 4:54  11/7/2021 6:24  C1
M3  11/7/2021 4:56  11/7/2021 6:26  C1
M1  11/7/2021 6:22  11/7/2021 7:52  C2
M2  11/7/2021 4:54  11/7/2021 6:24  C2
M3  11/7/2021 4:56  11/7/2021 6:26  C2
M1  11/7/2021 7:52  11/7/2021 9:22  C3
M2  11/7/2021 4:54  11/7/2021 6:24  C3
M3  11/7/2021 4:56  11/7/2021 6:26  C3
M1  11/7/2021 4:52  11/7/2021 6:22  C4
M2  11/7/2021 6:24  11/7/2021 7:54  C4
M3  11/7/2021 4:56  11/7/2021 6:26  C4
M1  11/7/2021 6:22  11/7/2021 7:52  C5
M2  11/7/2021 6:24  11/7/2021 7:54  C5
M3  11/7/2021 4:56  11/7/2021 6:26  C5
M1  11/7/2021 7:52  11/7/2021 9:22  C6
M2  11/7/2021 6:24  11/7/2021 7:54  C6
M3  11/7/2021 4:56  11/7/2021 6:26  C6
M1  11/7/2021 4:52  11/7/2021 6:22  C7
M2  11/7/2021 7:54  11/7/2021 9:24  C7
M3  11/7/2021 4:56  11/7/2021 6:26  C7
M1  11/7/2021 6:22  11/7/2021 7:52  C8
M2  11/7/2021 7:54  11/7/2021 9:24  C8
M3  11/7/2021 4:56  11/7/2021 6:26  C8
M1  11/7/2021 7:52  11/7/2021 9:22  C9
M2  11/7/2021 7:54  11/7/2021 9:24  C9
M3  11/7/2021 4:56  11/7/2021 6:26  C9
M1  11/7/2021 4:52  11/7/2021 6:22  C10
M2  11/7/2021 7:54  11/7/2021 9:24  C10
M3  11/7/2021 6:26  11/7/2021 7:56  C10
M1  11/7/2021 6:22  11/7/2021 7:52  C11
M2  11/7/2021 7:54  11/7/2021 9:24  C11
M3  11/7/2021 6:26  11/7/2021 7:56  C11
M1  11/7/2021 7:52  11/7/2021 9:22  C12
M2  11/7/2021 7:54  11/7/2021 9:24  C12
M3  11/7/2021 6:26  11/7/2021 7:56  C12
M1  11/7/2021 4:52  11/7/2021 6:22  C13
M2  11/7/2021 7:54  11/7/2021 9:24  C13
M3  11/7/2021 7:56  11/7/2021 9:26  C13
M1  11/7/2021 6:22  11/7/2021 7:52  C14
M2  11/7/2021 7:54  11/7/2021 9:24  C14
M3  11/7/2021 7:56  11/7/2021 9:26  C14
M1  11/7/2021 7:52  11/7/2021 9:22  C15
M2  11/7/2021 7:54  11/7/2021 9:24  C15
M3  11/7/2021 7:56  11/7/2021 9:26  C15

我试过什么? 我在 itertools 中使用了 combinationproduct 函数,但没有得到想要的结果。我也试过 groupby.

from  itertools import product
df = pd.DataFrame(list(product(*dt.values.T)))

试试 groupbyitertools.product:

df["UID"] = df["MID"]+(df.groupby("MID").transform("cumcount")+1).astype(str)
combinations = pd.Series(list(itertools.product(*df.groupby("MID")["UID"].agg(list).tolist())), name="UID")
combinations = combinations.explode()

output = df.merge(combinations.reset_index(), how="right", on="UID")
output["CName"] = "C" + (output["index"]+1).astype(str)
output = output.drop(["UID", "index"], axis=1)

>>> output
   MID                  ST                  ET CName
0   M1 2021-11-07 04:52:00 2021-11-07 06:22:00    C1
1   M2 2021-11-07 04:54:00 2021-11-07 06:24:00    C1
2   M3 2021-11-07 04:56:00 2021-11-07 06:26:00    C1
3   M1 2021-11-07 04:52:00 2021-11-07 06:22:00    C2
4   M2 2021-11-07 04:54:00 2021-11-07 06:24:00    C2
..  ..                 ...                 ...   ...
76  M2 2021-11-07 07:54:00 2021-11-07 09:24:00   C26
77  M3 2021-11-07 06:26:00 2021-11-07 07:56:00   C26
78  M1 2021-11-07 07:52:00 2021-11-07 09:22:00   C27
79  M2 2021-11-07 07:54:00 2021-11-07 09:24:00   C27
80  M3 2021-11-07 07:56:00 2021-11-07 09:26:00   C27