2017-07-19 8 views
11

使用して列で最小のインデックス:復帰nは、私は、次の(簡体字)のデータフレーム持っているパンダ

df = pd.DataFrame({'X': [1, 2, 3, 4, 5,6,7,8,9,10], 
'Y': [10,20,30,40,50,-10,-20,-30,-40,-50], 
'Z': [20,18,16,14,12,10,8,6,4,2]},index=list('ABCDEFGHIJ')) 

次を与える:

X Y Z 
A 1 10 20 
B 2 20 18 
C 3 30 16 
D 4 40 14 
E 5 50 12 
F 6 -10 10 
G 7 -20 8 
H 8 -30 6 
I 9 -40 4 
J 10 -50 2 

私はインデックスを返す新しいデータフレームを作成したいですn個の最小値のうち、列単位で

所望の出力(たとえば、3つの最小値):

X Y Z 
0 A J J 
1 B I I 
2 C H H 

これを行うための最善の方法は何ですか?

答えて

10

numpy.argsortと高速化numpyのソリューション:

N = 3 
a = np.argsort(-df.values, axis=0)[-1:-1-N:-1] 
print (a) 
[[0 9 9] 
[1 8 8] 
[2 7 7]] 

b = pd.DataFrame(df.index[a], columns=df.columns) 
print (b) 
    X Y Z 
0 A J J 
1 B I I 
2 C H H 

はタイミング

In [111]: %timeit (pd.DataFrame(df.index[np.argsort(-df.values, axis=0)[-1:-1-N:-1]], columns=df.columns)) 
159 µs ± 1.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

In [112]: %timeit (df.apply(lambda x: pd.Series(x.nsmallest(N).index))) 
3.52 ms ± 49.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 
9

あなたはnsmallestapplyを使用することができます。

n = 3 
df.apply(lambda x: pd.Series(x.nsmallest(n).index)) 

# X Y Z 
#0 A J J 
#1 B I I 
#2 C H H 
0

まず、あなたがあなたの入力をソートしたいですデータフレームごと各列のすべてのインデックスのリストを取得し、これらのインデックスからデータフレームを作成し、結果のデータフレームから上位n行を返します。

def topN(df, n): 
#first, sort dataframe per column 
sort_x = df.sort_values(by = ['X'], ascending = True) 
sort_y = df.sort_values(by = ['Y'], ascending = True) 
sort_z = df.sort_values(by = ['Z'], ascending = True) 
#now get a list of the indices of each sorted df 
index_list_x = sort_x.index.values.tolist() 
index_list_y = sort_y.index.values.tolist() 
index_list_z = sort_z.index.values.tolist() 
#create dataframe from lists 
sorted_df = pd.DataFrame(
    {'sorted_x':index_list_x, 
    'sorted_y':index_list_y, 
    'sorted_z':index_list_z 
    }) 
#return the top n from the sorted dataframe 
return sorted_df.iloc[0:n] 

topN(df,3) 

戻り値:

X Y Z 
0 A J J 
1 B I I 
2 C H H 
関連する問題