【问题标题】:Create a pandas dataframe column of variable sized lists创建可变大小列表的熊猫数据框列
【发布时间】:2021-03-14 07:12:29
【问题描述】:

我需要创建一个数据框,其中包含某些机器的调度程序的所有可能开始时间。我的初始数据框 (msDF) 包含三个简单的列:

  • MachID - 每台机器的 ID
  • 开始 - 机器可用于调度的开始日期时间
  • slots - 从那时起可用的插槽数

msDF 是从主数据帧复制而来,但为了便于说明,它可能如下所示:

msDF = pd.DataFrame({ 'MachID': [1,2,3,4,5],
                      'Start': ["02/04/2021 9:00","06/04/2021 12:30","09/04/2021 10:00", \
                                "12/04/2021 11:00","15/04/2021 08:00"],
                      'slots': [2, 3, 4, 3, 1]})
MachID Start slots
0 1 02/04/2021 9:00 2
1 2 06/04/2021 12:30 3
2 3 09/04/2021 10:00 4
3 1 12/04/2021 11:00 3
4 1 15/04/2021 08:00 1

我需要分解这个数据框,以便每一行都使用 slotIndex 重复“槽”次。所需的输出是:

MachID Start slots SlotIndex
0 1 02/04/2021 9:00 2 0
0 1 02/04/2021 9:00 2 1
1 2 06/04/2021 12:30 3 0
1 2 06/04/2021 12:30 3 1
1 2 06/04/2021 12:30 3 2

我的方法有问题。我在 SlotIndex 中创建可变长度列表并将它们分解,但这会产生警告。

为此,我使用:

msDF['SlotIndex'] = None
for x in msDF.index:
    msDF.SlotIndex.loc[x] = list(range(msDF.loc[x,'slots']))

它有效,但有警告: SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

我稍后分解 msDF 以获得我想要的结果:

msDF = msDF.explode('SlotIndex')

如何改进?

【问题讨论】:

    标签: python pandas dataframe explode


    【解决方案1】:

    使用重复。

    df.loc[df.index.repeat(df.slots)]
    

    索引将被重复。因此,您可以使用它来设置插槽 id。

    df['slot_id'] = 1
    df['slot_id'] = df.groupby(df.index)['slot_id'].transform('cumsum')
    

    【讨论】:

    • 太完美了。谢谢@sumith。它也非常快。
    • 我已经更新了答案。这是解决问题的一种方法。
    • 该修订版给出了我想要的结果,而我自己永远不会想出它。我根据重复获取了您的第一个答案,然后创建了一个新索引,我对插槽进行了模运算以创建 slot_id,但是 groupby 方法更简洁并提供了我想要的结果。再次感谢 - 我已经坚持了一段时间。我最初的解决方案在测试中有效,但由于我无法理解的原因而在运行中失败。你的工作正在彻头彻尾地工作。
    • 很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-01-14
    • 2021-06-08
    • 2017-08-27
    • 2021-09-29
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多