2017-06-21 11 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

EDIT:

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私は解決策を修正しました。 –

関連する問題