Saya dari kerangka data:

df = C1 C2 C3 from_time to_time
     a   b c     1         3
     q   t y     4         9

Saya ingin meledakkannya dengan nilai from_time , to_time, jadi itu akan menjadi:

df = C1 C2 C3 time from_time to_time
     a   b c    1      1         3
     a   b c    2      1         3
     a   b c    3      1         3
     q   t y    4      4         9
     q   t y    5      4         9

...

Apa cara terbaik untuk melakukannya? Terima kasih

1
okuoub 18 Mei 2021, 14:02

1 menjawab

Jawaban Terbaik

Gunakan DataFrame.explode dengan ranges jika DataFrames kecil:

df.insert(3, 'time', df.apply(lambda x: range(x.from_time, x.to_time + 1), axis=1))
df = df.explode('time')
print (df)
  C1 C2 C3 time  from_time  to_time
0  a  b  c    1          1        3
0  a  b  c    2          1        3
0  a  b  c    3          1        3
1  q  t  y    4          4        9
1  q  t  y    5          4        9
1  q  t  y    6          4        9
1  q  t  y    7          4        9
1  q  t  y    8          4        9
1  q  t  y    9          4        9

Untuk kinerja yang lebih baik gunakan Index.repeat< /a> dengan DataFrame.loc< /a> dan untuk kolom baru gunakan GroupBy.cumcount untuk penghitung per nilai indeks dengan nilai from_time:

df = df.loc[df.index.repeat(df.to_time.sub(df.from_time) + 1)]
df.insert(3, 'time', df.groupby(level=0).cumcount().add(df['from_time']))
print (df)
  C1 C2 C3  time  from_time  to_time
0  a  b  c     1          1        3
0  a  b  c     2          1        3
0  a  b  c     3          1        3
1  q  t  y     4          4        9
1  q  t  y     5          4        9
1  q  t  y     6          4        9
1  q  t  y     7          4        9
1  q  t  y     8          4        9
1  q  t  y     9          4        9
0
jezrael 18 Mei 2021, 11:09