2017-06-21 49 views
1

透視表:如何使用不同的索引比較pandas pivot_table中的值?

COURSE   ENGLISH  MATH  ART 
STUDENT    

StudentA  95.0   83.0  97.0 
StudentB  91.0   93.0  47.0 
StudentC  85.0   84.0  92.0 
StudentD  97.0   84.0  85.0 
StudentE  93.0   88.0  85.0 
StudentAvg  94.5   83.7  96.9 

我想誰擁有一個檔次比StudentAvg按主題超過5%下的學生名單。因此,在這種情況下,我想要的東西,如:

English: StudentC Math: Art: StudentB, StudentD, StudentE

我怎樣才能做到這一點的熊貓嗎?

回答

2

這返回一個元組列表,顯示哪個學生和哪個科目的成績比平均值低5%以上。

avg = df.loc['StudentAvg', :] 
i, j = np.where(((df/avg) - 1) < -.05) 
list(zip(df.index[i], df.columns[j])) 

[('StudentB', 'ART'), 
('StudentC', 'ENGLISH'), 
('StudentC', 'ART'), 
('StudentD', 'ART'), 
('StudentE', 'ART')] 

我們能不更加清晰之前,我加快了一下有

p = df.index.get_loc('StudentAvg') 
v = df.values 
i, j = np.where(((v/v[p]) - 1) < -.05) 
list(zip(df.index[i], df.columns[j])) 

[('StudentB', 'ART'), 
('StudentC', 'ENGLISH'), 
('StudentC', 'ART'), 
('StudentD', 'ART'), 
('StudentE', 'ART')] 

定時

%%timeit 
p = df.index.get_loc('StudentAvg') 
v = df.values 
i, j = np.where(((v/v[p]) - 1) < -.05) 
list(zip(df.index[i], df.columns[j])) 
10000 loops, best of 3: 41.7 µs per loop 

%%timeit 
avg = df.loc['StudentAvg', :] 
i, j = np.where(((df/avg) - 1) < -.05) 
list(zip(df.index[i], df.columns[j]))\ 
1000 loops, best of 3: 662 µs per loop 
+0

你是否告訴我分別計算了417秒和662秒?或者你的意思是你做了10000次迭代,而那些是最好的平均值? –

+1

@NishantRoy不! 41.7微秒和662微秒 – piRSquared

+0

41.7微秒爲整個代碼塊運行,對不對?或者你是說每循環多少時間,代碼塊需要10,000個循環。 –

1

編輯:

df.apply(lambda x: str(x.name)+ ': ' + ', '.join(df[((x-x.loc['StudentAvg'])/x.loc['StudentAvg']*100<-5.0)].index.tolist())).values.tolist() 

輸出:

['ENGLISH: StudentC', 'MATH: ', 'ART: StudentB, StudentC, StudentD, StudentE'] 

讓我們用這樣的:

mask = df.apply(lambda x: (x-x.loc['StudentAvg'])/x.loc['StudentAvg']*100<-5.0).any(axis=1) 
df[mask].index.tolist() 

輸出:

['StudentB', 'StudentC', 'StudentD', 'StudentE'] 
+0

對不起。我想通過'Subject'獲取一個列表,只是在帖子中添加了一個示例。你能修改你的答案嗎? –

+1

@NishantRoy我修改瞭解決方案。 –

相關問題