填充对象分组顺序,熊猫

时间:2019-07-08 17:49:23

标签: python pandas padding

这是我的数据框示例,

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)

我正在尝试填充(填充后)上述数据框,以便每个唯一ID都具有相同的形状。

这就是我的开始方式,

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

我希望每个id_unique都具有相同的形状。即(4,3)。因此,所有唯一ID的计数都相同。

如果是序列使用,我可以填充序列;

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 个答案:

答案 0 :(得分:4)

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  

答案 1 :(得分:3)

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