【问题标题】:Create a possible combination of start and end time of all machines创建所有机器的开始和结束时间的可能组合
【发布时间】:2021-12-23 05:42:25
【问题描述】:

我有一个数据框,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(最终的 dataframe 将是这个):

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)))

【问题讨论】:

    标签: python pandas dataframe loops combinations


    【解决方案1】:

    试试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
    

    【讨论】:

    • 如何添加组合列?请注意,索引 0,9 和 18 构成 C1 组合。我如何将它作为一个列?
    • 你怎么知道哪个组合是C1,哪个是C2等等?你有包含这些信息的 DataFrame 吗?
    • 你可以在问题中看到。 M1、M2 和 M3 的第一个可能值构成 C1。现在,保持 M2 和 M3 的 ST 和 ET 不变,添加时 M1 的第二个可能值会生成 C2。
    • 我以为你想要所有可能的组合?您只想要所有第一行、所有第二行和所有第三行吗?
    • 我想创建所有机器的开始和结束时间的可能组合,而不是只找到所有的可能性
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多