我目前正在尝试使用Pandas MultiIndex属性。我正在尝试以智能方式基于其列对现有DataFrame对象df_original
进行分组,因此考虑使用MultiIndex。
print df_original =
by_currency by_portfolio A B C
1 AUD a 1 2 3
2 AUD b 4 5 6
3 AUD c 7 8 9
4 AUD d 10 11 12
5 CHF a 13 14 15
6 CHF b 16 17 18
7 CHF c 19 20 21
8 CHF d 22 23 24
现在,我想要的是一个MultiIndex DataFrame对象,其中A, B
和C
以及by_portfolio
作为索引。看起来像
CHF AUD
A a 13 1
b 16 4
c 19 7
d 22 10
B a 14 2
b 17 5
c 20 8
d 23 11
C a 15 3
b 18 6
c 21 9
d 24 12
我尝试将df_original
中的所有列和搜索到的索引放入列表对象,并从那里创建一个新的DataFrame。这看起来有点麻烦,我无法弄清楚如何添加实际值。
也许某种groupby
更适合这个目的?我需要能够将这些数据添加到另一个类似的DataFrame中,因此我需要将生成的DataFrame稍后添加到另一个DataFrame中。
由于
答案 0 :(得分:3)
您可以结合使用stack
和unstack
:
In [50]: df.set_index(['by_currency', 'by_portfolio']).stack().unstack(0)
Out[50]:
by_currency AUD CHF
by_portfolio
a A 1 13
B 2 14
C 3 15
b A 4 16
B 5 17
C 6 18
c A 7 19
B 8 20
C 9 21
d A 10 22
B 11 23
C 12 24
要获得所需的结果,我们只需要交换索引的级别:
In [51]: df2 = df.set_index(['by_currency', 'by_portfolio']).stack().unstack(0)
In [52]: df2.columns.name = None
In [53]: df2.index = df2.index.swaplevel(0,1)
In [55]: df2 = df2.sort_index()
In [56]: df2
Out[56]:
AUD CHF
by_portfolio
A a 1 13
b 4 16
c 7 19
d 10 22
B a 2 14
b 5 17
c 8 20
d 11 23
C a 3 15
b 6 18
c 9 21
d 12 24