创建所有机器的开始和结束时间的可能组合
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
中使用了 combination
和 product
函数,但没有得到想要的结果。我也试过 groupby
.
from itertools import product
df = pd.DataFrame(list(product(*dt.values.T)))
试试 groupby
和 itertools.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
我有一个数据框 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
中使用了 combination
和 product
函数,但没有得到想要的结果。我也试过 groupby
.
from itertools import product
df = pd.DataFrame(list(product(*dt.values.T)))
试试 groupby
和 itertools.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