首页 > 解决方案 > 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 给了我以下错误:“看起来您的帖子主要是代码;请添加更多详细信息。”,所以我需要在帖子中添加一些额外的文本。请忽略。)

标签: pythonpandas

解决方案


使用按元组选择索引的第一MultiIndex列和用于避免丢失值的索引,然后按and重塑,最后更改顺序并按and排序:clustDataFrame.set_indexappend=TruedevDataFrame.stackDataFrame.unstackMultiIndexDataFrame.reorder_levelsDataFrame.sort_index

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  

与 reshape byDataFrame.stack和 transpose 类似的解决方案:

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  

推荐阅读