Python熊猫,如何转换数据框

时间:2020-03-25 07:31:06

标签: python pandas

我有一个数据框d1:

将熊猫作为pd导入

df1 = pd.DataFrame({('sw1', '2020-01-01 00:00:00'): {'A1': 5.496714153011234,
  'B1': 4.536582307187538,
  'C1': 6.465648768921554},
 ('sw1', '2020-01-01 00:15:00'): {'A1': 5.417291254384371,
  'B1': 5.089825801985299,
  'C1': 5.32977925506902},
 ('sw2', '2020-01-01 00:00:00'): {'A1': 5.593791702359273,
  'B1': 3.1212115651371235,
  'C1': 4.546877553622513},
 ('sw2', '2020-01-01 00:15:00'): {'A1': 6.385936244917259,
  'B1': 4.66918047921994,
  'C1': 5.303265379619803},
 ('clust', ''): {'A1': 1, 'B1': 2, 'C1': 3}})
df1.columns.names = ['None', 'dtime']
df1.index.names = ['dev']
df1

>>> df1
None                  sw1                                     sw2                     clust
dtime 2020-01-01 00:00:00 2020-01-01 00:15:00 2020-01-01 00:00:00 2020-01-01 00:15:00
dev
A1               5.496714            5.417291            5.593792            6.385936     1
B1               4.536582            5.089826            3.121212            4.669180     2
C1               6.465649            5.329779            4.546878            5.303265     3

我想将其转换为以下格式:

>>> df2
cust                        1                   2                   3
dev                        A1                  B1                  C1
sw                        sw1       sw2       sw1       sw2       sw1       sw2
dtime
2020-01-01 00:00:00  5.496714  5.593792  4.536582  3.121212  6.465649  4.546878
2020-01-01 00:15:00  5.417291  6.385936  5.089826  4.669180  5.329779  5.303265

该怎么做?

(我要添加此文本是因为stackoverflow给我以下错误:“看来您的帖子主要是代码;请添加更多详细信息。”,所以我需要在帖子中添加一些其他文本。请忽略)

1 个答案:

答案 0 :(得分:3)

第一个MultiIndexclust用元组选择索引,lifecycle policyappend=True索引以避免丢失dev值,然后用{{3} }和DataFrame.set_index,最后更改顺序在MultiIndex中,并按DataFrame.stackDataFrame.unstack排序:

df = (df1.set_index(('clust',''), append=True)
         .rename_axis(index=('dev','clust'), columns=('sw','dtime'))
         .stack()
         .unstack([0,1])
         .reorder_levels((2,1,0), axis=1)
         .sort_index(axis=1)
        )
print (df)
clust                       1                   2                   3  \
dev                        A1                  B1                  C1   
sw                        sw1       sw2       sw1       sw2       sw1   
dtime                                                                   
2020-01-01 00:00:00  5.496714  5.593792  4.536582  3.121212  6.465649   
2020-01-01 00:15:00  5.417291  6.385936  5.089826  4.669180  5.329779   

clust                          
dev                            
sw                        sw2  
dtime                          
2020-01-01 00:00:00  4.546878  
2020-01-01 00:15:00  5.303265  

通过DataFrame.reorder_levels重塑并转置的相似解法:

df = (df1.set_index(('clust',''), append=True)
         .rename_axis(index=('dev','clust'), columns=('sw','dtime'))
         .stack(0)
         .T
         .reorder_levels((1,0,2), axis=1)
        )
print (df)
clust                       1                   2                   3  \
dev                        A1                  B1                  C1   
sw                        sw1       sw2       sw1       sw2       sw1   
dtime                                                                   
2020-01-01 00:00:00  5.496714  5.593792  4.536582  3.121212  6.465649   
2020-01-01 00:15:00  5.417291  6.385936  5.089826  4.669180  5.329779   

clust                          
dev                            
sw                        sw2  
dtime                          
2020-01-01 00:00:00  4.546878  
2020-01-01 00:15:00  5.303265  
相关问题