2015-10-10 21 views
1

鉴于以下数据框:出栈或数据透视某些列

import pandas as pd 
DF = pd.DataFrame({'COL1': ['A', 'A', 'A', 'B','B','B'], 
        'COL2' : [1,2,3,1,2,3], 
        'COL3': [11032, 1960, 11400, 11355, 8, 7], 
        'year': ['2016', '2017', '2018', '2019', '2020', '2021']}) 
DF 

     COL1 COL2 COL3 COL4 year 
    0 A 1 2 11032 2016 
    1 A 2 2 1960  2017 
    2 A 3 4 11400 2018 
    3 B 1 2 11355 2019 
    4 B 2 2 8  2020 
    5 B 3 4 7  2021 

我只想通过COL1的方式,同时保持COL2和COL3在机智拆散“COL4”和“年”。最终结果应该是这样的:

COL2 COL3 COL4 (A) year (A) COL4 (B) year (B) 
0  1  2  11032  2016   11355  2019 
1  2  2  1960  2017   8   2020 
2  3  4  11400  2018   7   2021 

另外,如果在“COL1”下有一些没有“A”的记录怎么办?

我假设解决方案将查找在堆叠时匹配“COL2”和“COL3”的记录(如果这是使用的方法)。 由此,我的意思是如果列的顺序没有像我的例子那样排序,它会产生相同的结果。

谢谢!

回答

1

您可以在前3列设置多重索引,并使用unstacklevel=0
然后,您可以重命名列名称 - 或按levelslabels或自定义名称。

# COL1 COL2 COL3 COL4 year 
#0 A  1  2 11032 2016 
#1 A  2  2 1960 2017 
#2 A  3  4 11400 2018 
#3 B  1  2 11355 2019 
#4 B  2  2  8 2020 
#5 B  3  4  7 2021 

DF = DF.set_index(['COL1', 'COL2', 'COL3']) 
DF = DF.unstack(0).reset_index() 
print DF 
#  COL2 COL3 COL4   year 
#COL1    A  B  A  B 
#0  1 2 11032 11355 2016 2019 
#1  2 2 1960  8 2017 2020 
#2  3 4 11400  7 2018 2021 

levels = DF.columns.levels 
labels = DF.columns.labels 
DF.columns = levels[0][labels[0]] 
print DF 
# COL2 COL3 COL4 COL4 year year 
#0  1  2 11032 11355 2016 2019 
#1  2  2 1960  8 2017 2020 
#2  3  4 11400  7 2018 2021 
DF.columns = ['COL2','COL3','COL4','COL5','COL6','COL7'] 
print DF 
# COL2 COL3 COL4 COL5 COL6 COL7 
#0  1  2 11032 11355 2016 2019 
#1  2  2 1960  8 2017 2020 
#2  3  4 11400  7 2018 2021 

但是,如果列COL2COL3有不同的顺序,您可以通过安迪·海登使用little hack

# COL1 COL2 COL3 COL4 year 
#0 A  4  6 11032 2016 
#1 A  9  2 1960 2017 
#2 A  8  4 11400 2018 
#3 B  4  6 11355 2019 
#4 B  9  2  8 2020 
#5 B  8  4  7 2021 
DF = DF.set_index(['COL1', 'COL2', 'COL3']) 

index = pd.MultiIndex(levels=[DF.index.get_level_values(1).unique(), 
        DF.index.get_level_values(2).unique()], 
        labels=[[0, 1, 2], 
        [0, 1, 2]]) 
DF = DF.unstack(0) 
DF = DF.reindex(index).reset_index() 
print DF 
#  level_0 level_1 COL4   year 
#COL1      A  B  A  B 
#0   4  6 11032 11355 2016 2019 
#1   9  2 1960  8 2017 2020 
#2   8  4 11400  7 2018 2021 
levels = DF.columns.levels 
labels = DF.columns.labels 
DF.columns = levels[0][labels[0]] 
print DF 
# level_0 level_1 COL4 COL4 year year 
#0  4  6 11032 11355 2016 2019 
#1  9  2 1960  8 2017 2020 
#2  8  4 11400  7 2018 2021 
DF.columns = ['COL2','COL3','COL4','COL5','COL6','COL7'] 
print DF 
# COL2 COL3 COL4 COL5 COL6 COL7 
#0  4  6 11032 11355 2016 2019 
#1  9  2 1960  8 2017 2020 
#2  8  4 11400  7 2018 2021