【问题标题】:Create copies of each column next to it for a pivot table in pandas为 pandas 中的数据透视表创建旁边每一列的副本
【发布时间】:2016-08-29 15:12:34
【问题描述】:

表格如下:

Sensors M001    M002        
Time                                                                                    
01:28.2  0      0               
01:40.2  1      1               
01:52.2  0      1               
02:04.2  1      0   

我想创建一个表,每列有 2 个新的空副本,如下所示:

Sensors M001 M001(on) M001(off) M002    M002(on)  M002(off) 
Time                                                                                    
01:28.2  0      -       -       0        -         -
01:40.2  1      -       -       1        -         -
01:52.2  0      -       -       1        -         -
02:04.2  1      -       -       0        -         -

【问题讨论】:

  • 请至少付出一些努力,所以不是编写代码服务。

标签: pandas jupyter


【解决方案1】:

IIUC 您可以使用loc 创建新列,然后按sort_index 对列名称进行排序:

for col in df.columns:
    df.loc[:, col + '(on)'] = np.nan
    df.loc[:, col + '(off)'] = np.nan

print df.sort_index(1)

Sensors  M001  M001(off)  M001(on)  M002  M002(off)  M002(on)
Time                                                         
01:28.2     0        NaN       NaN     0        NaN       NaN
01:40.2     1        NaN       NaN     1        NaN       NaN
01:52.2     0        NaN       NaN     1        NaN       NaN
02:04.2     1        NaN       NaN     0        NaN       NaN

另一种选择是通过列表理解创建新的列名,然后将新的DataFrameconcat 重新创建为原始df

print df

Sensors  M001  M002  M003
Time                     
01:28.2     0     0     1
01:40.2     1     1     0
01:52.2     0     1     1
02:04.2     1     0     1

cols = ['{}{}'.format(x, y) for y in ['(on)','(off)'] for x in df.columns.tolist()]
df1 = pd.DataFrame(columns = cols, index= df.index)
print df1
        M001(on) M002(on) M003(on) M001(off) M002(off) M003(off)
Time                                                            
01:28.2      NaN      NaN      NaN       NaN       NaN       NaN
01:40.2      NaN      NaN      NaN       NaN       NaN       NaN
01:52.2      NaN      NaN      NaN       NaN       NaN       NaN
02:04.2      NaN      NaN      NaN       NaN       NaN       NaN

df = pd.concat([df,df1], axis=1)

print df.sort_index(1)
Sensors  M001 M001(off) M001(on)  M002 M002(off) M002(on)  M003 M003(off)  \
Time                                                                        
01:28.2     0       NaN      NaN     0       NaN      NaN     1       NaN   
01:40.2     1       NaN      NaN     1       NaN      NaN     0       NaN   
01:52.2     0       NaN      NaN     1       NaN      NaN     1       NaN   
02:04.2     1       NaN      NaN     0       NaN      NaN     1       NaN   

Sensors M003(on)  
Time              
01:28.2      NaN  
01:40.2      NaN  
01:52.2      NaN  
02:04.2      NaN  

【讨论】:

  • 非常感谢您的帮助,第二个选项效果很好,下次生病发布我的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2016-09-27
  • 2020-11-11
  • 2019-09-30
  • 2018-10-28
相关资源
最近更新 更多