我有以下DataFrame,每个观察结果都位于单独的行上。
df = pd.DataFrame({'geo': ['US', 'US', 'US', 'NY', 'NY', 'NY', 'NY', 'CT', 'CT'],
'series': ['a', 'a', 'b', 'a', 'a', 'b', 'b', 'a', 'b'],
'value': [1,2,3,7,4,3,4,12,13],
'date': ['3/1', '3/2', '3/1', '3/1', '3/2', '3/1', '3/2', '3/1', '3/2']})
date geo series value
0 3/1 US a 1
1 3/2 US a 2
2 3/1 US b 3
3 3/1 NY a 7
4 3/2 NY a 4
5 3/1 NY b 3
6 3/2 NY b 4
7 3/1 CT a 12
8 3/2 CT b 13
我想要的:我想重新组织DataFrame,以使“ date”变量是索引,而geo&series是multiindex列变量。那是:
US US NY NY CT CT
a b a b a b
3/1 1 3 7 3 12 13
3/2 2 nan 4 4 nan nan
我尝试过的操作:我尝试将索引设置为日期,地理位置,系列,然后使用“ unstack”,但这给了我一个“重复值”错误。
答案 0 :(得分:1)
通常您可以stack()
和unstack()
:
df.set_index(['date','geo','series'])['value'].unstack(['geo','series'])
输出:
geo US NY CT
series a b a b a b
date
3/1 1.0 3.0 7.0 3.0 12.0 NaN
3/2 2.0 NaN 4.0 4.0 NaN 13.0
它会给您带来重复错误,因为您在date, geo, series
的三列上都有重复的数据,例如:
date geo series value
3/1 US a 1
3/1 US a 2
要确认这一点,请尝试执行以下操作:
df.duplicated(['date','geo','series']).any()
# should give you True
根据要对重复项进行的操作,可以使用groupby
:
# mean:
(df.groupby(['date','geo','series'])
['value'].mean()
.unstack(['geo','series'])
)