2017-08-01 69 views
1

採取有序的子集,我有一個大表看起來是這樣的:如何從大熊貓多級數據幀

enter image description here

上圖顯示只有表的前一部分。

現在我想在列「201723」表進行降序排列,並從整個表只取前5行。

我嘗試下面的代碼:

def func(x): 
    return x.sort_values(by='201723',ascending=False)[:5] 

bcom_hang_tbl.groupby(['h_platformid', 'model']).apply(func) 

導致:![在這裏輸入的形象描述] [2]

[2]

這不是我想要的因爲h_platformid和模型索引是重複的。

我試過一個又一個這樣的:

def func(x): 
    return x.sort_values(by='201723',ascending=False)[:5] 

bcom_hang_tbl.groupby(['h_platformid', 'model'], as_index=False).apply(func) 

而且我得到一個更好的結果:![在這裏輸入的形象描述] [3] [3]

,但它仍然是不由於新增加的整數索引令人滿意,如上圖紅色所示。

我終於嘗試這一個:

def func(x): 
    x = x.sort_values(by='201723',ascending=False)[:5] 
    return x.loc[:, 'ld_fwv':] 

bcom_hang_tbl.reset_index().groupby(['h_platformid', 'model']).apply(func).loc[:, 'ld_fwv':] 

仍然沒有工作:[![在這裏輸入的形象描述] [4] [4]

我怎麼能做到這一點?

@MaxU,對不起,我做了一個mistake.I'v改變了我的小樣本數據,以這樣的:

index = pd.MultiIndex.from_arrays([['X', 'X', 'X', 'Y', 'Y','Y'], [1, 3, 5, 1, 3, 5]], names=['M1', 'M2']) 

df = pd.DataFrame(np.arange(30).reshape(6,5), columns=list('ABCDE'), index=index) 

df.groupby('M1').apply(lambda x: x.nlargest(2, 'A')) 

現在的結果是這樣的: enter image description here

由於在大表例如,索引M1被複制。

回答

1

IIUC我們可以使用DataFrame.nlargest()方法:

In [56]: df.groupby(level=0, group_keys=False).apply(lambda x: x.nlargest(2, 'A')) 
Out[56]: 
     A B C D E 
M1 M2 
X 5 10 11 12 13 14 
    3 5 6 7 8 9 
Y 5 25 26 27 28 29 
    3 20 21 22 23 24 
+0

感謝您的回答。但建議的方法重複h_platformid和模型索引。 – Royalblue

+0

@Royalblue,你能提供一個文本形式的樣本數據集嗎? – MaxU

+1

我編輯了我的帖子,請看看。 – Royalblue