在 pandas 中为枢轴 table 创建其旁边每一列的副本

Create copies of each column next to it for a pivot table in pandas

Table 看起来像这样:

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

我想创建一个 table,每列有 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        -         -

IIUC 你可以使用 loc for creating new columns and then sort columns names by 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