Репликация строк в кадре данных pandas значением столбца

Я хочу реплицировать строки в Pandas Dataframe. Каждая строка должна повторяться n раз, где n - поле каждой строки.

import pandas as pd

what_i_have = pd.DataFrame(data={
  'id': ['A', 'B', 'C'],
  'n' : [  1,   2,   3],
  'v' : [ 10,  13,   8]
})

what_i_want = pd.DataFrame(data={
  'id': ['A', 'B', 'B', 'C', 'C', 'C'],
  'v' : [ 10,  13,  13,   8,   8,   8]
})

Возможно ли это?

Ответ 1

Вы можете использовать np.repeat для получения повторяющихся индексов, а затем использовать их для индексации в кадре:

>>> df2 = df.loc[np.repeat(df.index.values,df.n)]
>>> df2
  id  n   v
0  A  1  10
1  B  2  13
1  B  2  13
2  C  3   8
2  C  3   8
2  C  3   8

После чего нужно только немного очистить:

>>> df2 = df2.drop("n",axis=1).reset_index(drop=True)
>>> df2
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

Обратите внимание: если у вас могут быть повторяющиеся индексы, о которых можно беспокоиться, вы можете использовать .iloc:

In [86]: df.iloc[np.repeat(np.arange(len(df)), df["n"])].drop("n", axis=1).reset_index(drop=True)
Out[86]: 
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

который использует позиции, а не метки индексов.

Ответ 2

Вы можете использовать set_index и repeat

In [1057]: df.set_index(['id'])['v'].repeat(df['n']).reset_index()
Out[1057]:
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

Подробнее

In [1058]: df
Out[1058]:
  id  n   v
0  A  1  10
1  B  2  13
2  C  3   8