Дублирование строк в DataFrame на основе значения столбца - PullRequest
2 голосов
/ 30 апреля 2019

Ниже приведен пример данных, с которыми я работаю:

sample_dat = pd.DataFrame(
    np.array([[1,0,1,1,1,5],
              [0,0,0,0,1,3],
              [1,0,0,0,1,1],
              [1,0,0,1,1,1],
              [1,0,0,0,1,1],
              [1,1,0,0,1,1]]),
    columns=['var1','var2','var3','var4','var5','cnt']
)

Мне нужно изменить данные, чтобы строки дублировались в соответствии со значением в последнем столбце. В частности, я хочу, чтобы он дублировался на основе значения в столбце cnt.

Мой поиск дал много информации о расплавлении, расщеплении и прочем. Я думаю, что то, что я ищу, очень просто, надеюсь. Также обратите внимание, что в первом столбце у меня, скорее всего, будет какой-то идентификатор, который будет либо целым числом, либо строкой.

Например, первая запись будет продублирована еще 4 раза. Вторая запись будет дублирована еще дважды.

Пример того, как будет выглядеть DataFrame, если бы я делал это вручную с синтаксисом, приведен ниже:

sample_dat2 = pd.DataFrame(
    np.array([[1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [1,0,1,1,1,5],
              [0,0,0,0,1,3],
              [0,0,0,0,1,3],
              [0,0,0,0,1,3],
              [1,0,0,0,1,1],
              [1,0,0,1,1,1],
              [1,0,0,0,1,1],
              [1,1,0,0,1,1]]),
    columns=['var1','var2','var3','var4','var5','cnt']
)

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Я буду использовать numpy repeat в зависимости от местоположения индекса данных. Затем сбросьте индекс.

sample_dat.loc[numpy.repeat(sample_dat.index.values, sample_dat.cnt)].reset_index(drop=True)

Результат:

   var1 var2 var3 var4 var5 cnt
0      1    0   1   1   1   5
1      1    0   1   1   1   5
2      1    0   1   1   1   5
3      1    0   1   1   1   5
4      1    0   1   1   1   5
5      0    0   0   0   1   3
6      0    0   0   0   1   3
7      0    0   0   0   1   3
8      1    0   0   0   1   1
9      1    0   0   1   1   1
10     1    0   0   0   1   1
11     1    1   0   0   1   1
0 голосов
/ 30 апреля 2019

Вы можете использовать numpy.repeat вместе с индексированием для возврата массива значений из столбца, который определяет количество повторений.

import numpy as np
import pandas as pd

arr = np.array(
    [[1,0,1,1,1,5],
     [0,0,0,0,1,3],
     [1,0,0,0,1,1],
     [1,0,0,1,1,1],
     [1,0,0,0,1,1],
     [1,1,0,0,1,1]]
    )

df = pd.DataFrame(
    np.repeat(arr, arr[:,5], axis=0),
    columns=['var1','var2','var3','var4','var5','cnt']
    )

print(df)
#     var1  var2  var3  var4  var5  cnt
# 0      1     0     1     1     1    5
# 1      1     0     1     1     1    5
# 2      1     0     1     1     1    5
# 3      1     0     1     1     1    5
# 4      1     0     1     1     1    5
# 5      0     0     0     0     1    3
# 6      0     0     0     0     1    3
# 7      0     0     0     0     1    3
# 8      1     0     0     0     1    1
# 9      1     0     0     1     1    1
# 10     1     0     0     0     1    1
# 11     1     1     0     0     1    1
0 голосов
/ 30 апреля 2019

Создайте пустой фрейм данных, затем итерируйте свои данные, добавляя каждую строку в новый фрейм x количество раз, где x - это число в столбце 'cnt'.

df =pd.DataFrame()

for index, row in sample_dat.iterrows():
    for x in range(row['cnt']):
        df = df.append(row, ignore_index=True)

Вывод

>>> df
   cnt  var1  var2  var3  var4  var5
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
0  5.0   1.0   0.0   1.0   1.0   1.0
1  3.0   0.0   0.0   0.0   0.0   1.0
1  3.0   0.0   0.0   0.0   0.0   1.0
1  3.0   0.0   0.0   0.0   0.0   1.0
2  1.0   1.0   0.0   0.0   0.0   1.0
3  1.0   1.0   0.0   0.0   1.0   1.0
4  1.0   1.0   0.0   0.0   0.0   1.0
5  1.0   1.0   1.0   0.0   0.0   1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...