从现有数据框创建多索引列Pandas数据框

时间:2020-05-12 18:00:16

标签: python pandas dataframe

我有以下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”,但这给了我一个“重复值”错误。

1 个答案:

答案 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'])
)