python - 填充 groupby 对象序列,Pandas

标签 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   

最佳答案

重建索引


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

堆栈

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  

关于python - 填充 groupby 对象序列,Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940172/

相关文章:

android - 更改无边框按钮的填充

python - 如何使用 python 加密/解密任意长度的二进制文件?

python - python中的子进程错误

python - pyodbc - 无法连接到 DSN

python - 基于子列表中的字母数字字符串的列表列表的自然排序?

python - 如何使用pandas有效获取多个二值特征?

python - 链接 "is"运算符

Python:如何过滤具有 Item D 和 D 之前的任何 Item 的 ID

python - 将一列替换为属于两个不同数据框的另一列的值

html - 向右浮动