将DataFrame列重塑为多列,其他列重塑为行

时间:2019-08-07 19:31:26

标签: python pandas dataframe

我有一个DataFrame,我需要将一列变成多列,然后创建另一列来索引/标记新列/多列的值

import pandas as pd

df = pd.DataFrame({'state':['AK','AK','AK','AK','AL','AL','AL','AL'], 'county':['Cnty1','Cnty1','Cnty2','Cnty2','Cnty3','Cnty3','Cnty4','Cnty4'], 
        'year':['2000','2001','2000','2001','2000','2001','2000','2001'], 'count1':[5,7,4,8,9,1,0,1], 'count2':[8,1,4,6,7,3,8,5]})

enter image description here

使用pivot_table()reset_index(),我可以将year的值移动到列中,但不能通过其他列将其分解。

使用: ivotDF = pd.pivot_table(df,index = ['state','county'],column ='year') axisDF = ivotDF.reset_index()

让我靠近,而不是我需要的东西。

我需要的是另一列标签为count1和count2的列,其中包含year列中的值。看起来像这样:

enter image description here

我意识到一个DataFrame会填入'state'和'county'的所有值,这很好,但是我将其输出到Excel,并希望它看起来像这样,所以如果有一种方法这种格式将是一个奖励。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您要先搜索pivot,然后再搜索stack

s=df.pivot_table(index=['state','county'],columns='year',values=['count1','count2'],aggfunc='mean').stack(level=0)
s
Out[142]: 
year                 2000  2001
state county                   
AK    Cnty1  count1     5     7
             count2     8     1
      Cnty2  count1     4     8
             count2     4     6
AL    Cnty3  count1     9     1
             count2     7     3
      Cnty4  count1     0     1
             count2     8     5

答案 1 :(得分:1)

您已将大部分答案记下来。只需添加一个带有level=0的堆栈,即可在该级别而不是默认年份级别上进行堆栈。

pd.pivot_table(df, index=['state', 'county'], columns='year', values=['count1', 'count2']) \
    .stack(level=0)