Реплицируйте несколько строк событий для определенных идентификаторов несколько раз - PullRequest
1 голос
/ 24 сентября 2019

У меня есть данные журнала вызовов, сделанные на клиентов.Это выглядит примерно так, как показано ниже, где ID - это идентификатор клиента, а A и B - атрибуты журнала:

import pandas as pd 
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'),
                  index = ['A','A','A','B','B','C','C','C','D','D'])
df['ID']=df.index
df = df[['ID','A','B']]
  ID   A   B
A  A  46  31
A  A  99  54
A  A  34   9
B  B  46  48
B  B   7  75
C  C   1  25
C  C  71  40
C  C  74  53
D  D  57  17
D  D  19  78

Я хочу реплицировать каждый набор событий для каждого идентификатора на основе некоторых слотов.Например, если значение слота равно 2, то все события для идентификатора «А» должны быть реплицированы в слот-1 раз.

  ID   A   B
A  A  46  31
A  A  99  54
A  A  34   9

A  A  46  31
A  A  99  54
A  A  34   9

и должен быть создан новый индекс, указывающий, к какому слоту относятся реплицированные значения:

ID   A   B Index
 A  46  31  A-1
 A  99  54  A-1
 A  34   9  A-1

 A  46  31  A-2
 A  99  54  A-2
 A  34   9  A-2

Я пробовал следующее решение:

slots = 2
nba_data = pd.DataFrame()
idx = pd.Index(list(range(1,slots+1))) 

for i in unique_rec_counts_dict:
    b = df.loc[df.ID==i,:]
    b = b.append([b]*(slots-1),ignore_index=True)
    b['Index'] = str(i)+'-'+idx.repeat(unique_rec_counts_dict[i]).astype(str)
    nba_data = nba_data.append(b)

оно дает ожидаемый результат, но не масштабируется при увеличении количества слотов и увеличении количества клиентов до 10 тыс.

  ID   A   B Index
0  A  46  31   A-1
1  A  99  54   A-1
2  A  34   9   A-1
3  A  46  31   A-2
4  A  99  54   A-2
5  A  34   9   A-2
0  B  46  48   B-1
1  B   7  75   B-1
2  B  46  48   B-2
3  B   7  75   B-2
0  C   1  25   C-1
1  C  71  40   C-1
2  C  74  53   C-1
3  C   1  25   C-2
4  C  71  40   C-2
5  C  74  53   C-2
0  D  57  17   D-1
1  D  19  78   D-1
2  D  57  17   D-2
3  D  19  78   D-2

Я думаю, что это занимает много времени из-за петли.Любое решение, которое векторизовано, будет действительно полезным.

1 Ответ

1 голос
/ 24 сентября 2019

Вы можете попробовать:

slots = 2
new_df = pd.concat(df.assign(Index=f'_{i}') for i in range(1, slots+1))

new_df['Index'] = new_df['ID'] + new_df['Index']

Вывод:

  ID   A   B Index
A  A  48  61   A_1
A  A  70  13   A_1
A  A  36  23   A_1
B  B  22  66   B_1
B  B  92  95   B_1
C  C  53   9   C_1
C  C  41  57   C_1
C  C  88  93   C_1
D  D  76  82   D_1
D  D  11  36   D_1
A  A  48  61   A_2
A  A  70  13   A_2
A  A  36  23   A_2
B  B  22  66   B_2
B  B  92  95   B_2
C  C  53   9   C_2
C  C  41  57   C_2
C  C  88  93   C_2
D  D  76  82   D_2
D  D  11  36   D_2
...