我有一个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]})
使用pivot_table()
和reset_index()
,我可以将year的值移动到列中,但不能通过其他列将其分解。
使用: ivotDF = pd.pivot_table(df,index = ['state','county'],column ='year') axisDF = ivotDF.reset_index()
让我靠近,而不是我需要的东西。
我需要的是另一列标签为count1和count2的列,其中包含year列中的值。看起来像这样:
我意识到一个DataFrame会填入'state'和'county'的所有值,这很好,但是我将其输出到Excel,并希望它看起来像这样,所以如果有一种方法这种格式将是一个奖励。
非常感谢。
答案 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)