2016-12-12 11 views
1

私は、Team、Year、およびGenderで値がインデックス付けされている以下のマルチインデックスPandasシリーズのようなものを持っています。パンダは複数の列のインデックス順を並べ替えます

>>> import pandas as pd 
>>> import numpy as np 
>>> multi_index=pd.MultiIndex.from_product([['Team A','Team B', 'Team C', 'Team D'],[2015,2016],['Male','Female']], names = ['Team','Year','Gender']) 
>>> np.random.seed(0) 
>>> df=pd.Series(index=multi_index, data=np.random.randint(1, 10, 16)) 
>>> df 
>>> 
Team Year Gender 
Team A 2015 Male  6 
       Female 1 
     2016 Male  4 
       Female 4 
Team B 2015 Male  8 
       Female 4 
     2016 Male  6 
       Female 3 
Team C 2015 Male  5 
       Female 8 
     2016 Male  7 
       Female 9 
Team D 2015 Male  9 
       Female 2 
     2016 Male  7 
       Female 8 

私の目標は、4年/性別の組み合わせごとに、チームにランク順(男性2015、2016男性、女性2015、および女性2016)のデータフレームを取得することです。

それはチームによってインデックス付けされるように、私のアプローチは、最初のデータフレームスタックを解除することであった

...

>>> unstacked_df = df.unstack(['Year','Gender']) 
>>> print unstacked_df 
>>> 
>>> 
Year 2015  2016  
Gender Male Female Male Female 
Team       
Team A 6  1 4  4 
Team B 8  4 6  3 
Team C 5  8 7  9 
Team D 9  2 7  8 

そしてをループして、これらの4列のそれぞれをソートすることによって、インデックスの受注からデータフレームを作成します。 ..

>>> team_orders = np.array([unstacked_df.sort_values(x).index.tolist() for x in unstacked_df.columns]).T 
>>> result = pd.DataFrame(team_orders, columns=unstacked_df.columns) 
>>> print result 
Year  2015   2016   
Gender Male Female Male Female 
0  Team C Team A Team A Team B 
1  Team A Team D Team B Team A 
2  Team B Team B Team C Team D 
3  Team D Team C Team D Team C 

もっと簡単なアプローチがありますか?

答えて

2

あなたの積み重ねバージョンから始めて、あなたは順番に各列をランク付けする.apply()と​​を使用することができ、その後、ちょうどインデックスに対する参照としてその使用:

df.unstack([1,2]).apply(lambda x: x.index[x.argsort()]).reset_index(drop=True) 

Year  2015   2016   
Gender Male Female Male Female 
0  Team C Team A Team A Team B 
1  Team A Team D Team B Team A 
2  Team B Team B Team C Team D 
3  Team D Team C Team D Team C 

EDIT:ここでは、もう少し情報が上ですなぜこの作品。ただ​​を使用すると、取得:

print df.unstack([1,2]).apply(lambda x: x.argsort()) 

Year 2015  2016  
Gender Male Female Male Female 
Team       
Team A 2  0 0  1 
Team B 0  3 1  0 
Team C 1  1 2  3 
Team D 3  2 3  2 

ルックアップビットは、基本的にちょうど列ごとに次のことをやっている:

df.unstack([1,2]).index[[2,0,1,3]] 

Index([u'Team C', u'Team A', u'Team B', u'Team D'], dtype='object', name=u'Team') 

.reset_index()は今、無意味なインデックスラベルを取り除きます。

+0

非常に良い。 argsortが各列をソートするインデックスを与える方法を理解していますが、x.index [x.argsort()]が正しく順序付けられたチームインデックスをどのように与えるかはわかりません。 – AJG519

関連する問題