pandas 按单元格值分解数据框

pandas explode dataframe by values of cell

我来自数据框:

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

我想按from_time、to_time的值展开,所以会是:

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

...

最好的方法是什么? 谢谢

如果数据帧较小,则使用 DataFrame.exploderanges:

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

为了更好的性能,使用 Index.repeat with DataFrame.loc and for new column use GroupBy.cumcount 计数器每个索引值 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