Пэд последовательность групповых объектов, панд - PullRequest
1 голос
/ 08 июля 2019

Вот пример моего фрейма данных,

d = {'id':['aa','aa','aa','aa','dd','dd','dd','ee','ee','ee','ee','ee'],
     'B': [3,2.9,4,2.3,3.1,2.2,2.9,4,2.3,3.3,2.9,3],
    'C':[1.9,2.2,2.9,0.2,1,2.1,1.3,3,3.1,2.2,2.9,0.2]}
df = pd.DataFrame(data=d)
df['tp'] = pd.to_timedelta(df.groupby('id').cumcount() * 30, unit='S')
df.set_index('tp', inplace=True)

Я пытаюсь дополнить (после заполнения) вышеупомянутый фрейм данных, чтобы каждый уникальный идентификатор имел одинаковую форму.

Вот как я начал,

g = df.groupby('id')
for id, id_unique in g:
    print(id_unique)

Я хочу, чтобы каждый id_unique имел одинаковую форму.т.е. (4,3).Таким образом, все уникальные идентификаторы будут иметь одинаковое количество.

Я могу дополнить последовательность, если используется серия;

pad_sequences(data, padding='post', maxlen=max_seq)

Но я потерял, как дополнять данные.

Как ...

           A    B    C  id  
tp                                                     
00:00:00  1.0  3.0  1.9  aa      
00:00:30  1.0  2.9  2.2  aa      
00:01:00  2.1  4.0  2.9  aa     
00:01:30  1.3  2.3  0.2  aa      
00:02:00  0.0  0.0  0.0  aa  

            A    B    C  id     
tp                                                     
00:00:00  1.1  3.1  1.0  dd      
00:00:30  1.2  2.2  2.1  dd      
00:01:00  1.9  2.9  1.3  dd      
00:01:30  0.0  0.0  0.0  dd     
00:02:00  0.0  0.0  0.0  dd      

            A    B    C  id      
tp                                                     
00:00:00  1.0  4.0  3.0  ee      
00:00:30  2.1  2.3  3.1  ee     
00:01:00  1.3  3.3  2.2  ee      
00:01:30  0.9  2.9  2.9  ee     
00:02:00  2.0  3.0  0.2  ee

Каким будет мой новый фрейм данных.

            A    B    C     
tp                                                     
00:00:00  1.0  3.0  1.9        
00:00:30  1.0  2.9  2.2       
00:01:00  2.1  4.0  2.9      
00:01:30  1.3  2.3  0.2       
00:02:00  0.0  0.0  0.0                                  
00:00:00  1.1  3.1  1.0      
00:00:30  1.2  2.2  2.1       
00:01:00  1.9  2.9  1.3      
00:01:30  0.0  0.0  0.0      
00:02:00  0.0  0.0  0.0                                                           
00:00:00  1.0  4.0  3.0        
00:00:30  2.1  2.3  3.1      
00:01:00  1.3  3.3  2.2       
00:01:30  0.9  2.9  2.9      
00:02:00  2.0  3.0  0.2   

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

reindex


idx = pd.MultiIndex.from_product(
        [df.index.unique(), df['id'].unique()], names=['tp', 'id'])

(df.set_index('id', append=True)
  .reindex(idx, fill_value=0).sort_index(level=[1, 0]).reset_index(1))

          id    B    C
tp
00:00:00  aa  3.0  1.9
00:00:30  aa  2.9  2.2
00:01:00  aa  4.0  2.9
00:01:30  aa  2.3  0.2
00:02:00  aa  0.0  0.0
00:00:00  dd  3.1  1.0
00:00:30  dd  2.2  2.1
00:01:00  dd  2.9  1.3
00:01:30  dd  0.0  0.0
00:02:00  dd  0.0  0.0
00:00:00  ee  4.0  3.0
00:00:30  ee  2.3  3.1
00:01:00  ee  3.3  2.2
00:01:30  ee  2.9  2.9
00:02:00  ee  3.0  0.2

stack

df.set_index('id', append=True).unstack(fill_value=0, level=0).stack()

               B    C  
id tp                  
aa 00:00:00  3.0  1.9  
   00:00:30  2.9  2.2  
   00:01:00  4.0  2.9  
   00:01:30  2.3  0.2  
   00:02:00  0.0  0.0  
dd 00:00:00  3.1  1.0  
   00:00:30  2.2  2.1  
   00:01:00  2.9  1.3  
   00:01:30  0.0  0.0  
   00:02:00  0.0  0.0  
ee 00:00:00  4.0  3.0  
   00:00:30  2.3  3.1  
   00:01:00  3.3  2.2  
   00:01:30  2.9  2.9  
   00:02:00  3.0  0.2  
3 голосов
/ 08 июля 2019

reindex

def f(d):
    return pd.MultiIndex.from_product(d.index.levels, names=d.index.names)

def g(d):
    return d.reindex(f(d), fill_value=0)

df.set_index('id', append=True).pipe(g) \
  .reset_index('id').sort_values(['id', 'tp'])

          id    B    C
tp                    
00:00:00  aa  3.0  1.9
00:00:30  aa  2.9  2.2
00:01:00  aa  4.0  2.9
00:01:30  aa  2.3  0.2
00:02:00  aa  0.0  0.0
00:00:00  dd  3.1  1.0
00:00:30  dd  2.2  2.1
00:01:00  dd  2.9  1.3
00:01:30  dd  0.0  0.0
00:02:00  dd  0.0  0.0
00:00:00  ee  4.0  3.0
00:00:30  ee  2.3  3.1
00:01:00  ee  3.3  2.2
00:01:30  ee  2.9  2.9
00:02:00  ee  3.0  0.2
...