【发布时间】: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