2014-11-06 5 views
16

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

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] 
}) 

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

+0

Есть ли основания для этого? Я думаю, что дублирование данных лучше всего избежать. – greole

+0

Ну, это промежуточный шаг: я генерирую столбец «v» в соответствии с распределением вероятности, а затем добавляю еще один столбец, произвольно выбирая строки из другого набора данных. –

+0

По-прежнему я не вижу причины не делать этого напрямую. Но мне нужна дополнительная информация о том, чего вы на самом деле пытаетесь достичь. – greole

ответ

27

Вы можете использовать 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

С более новой версией может быть 'df.loc [df.index.repeat (df.n)]' – Zero

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 
Смежные вопросы