2017-07-19 16 views
11

tôi có như sau (giản thể) dataframe:trở n chỉ số nhỏ nhất của gấu trúc cột sử dụng

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')) 

Mà cho những điều sau đây:

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 

Tôi muốn tạo ra một dataframe mới mà trả về chỉ số của n giá trị nhỏ nhất, theo cột.

đầu ra mong muốn (ví dụ, 3 giá trị nhỏ nhất):

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

cách tốt nhất để làm điều này là gì?

Trả lời

10

giải pháp nhanh hơn NumPy với numpy.argsort:

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 

Thời gian:

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

Bạn có thể sử dụng apply với nsmallest:

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

Trước tiên, bạn muốn sắp xếp đầu vào của bạn dataframe trên mỗi cột, sau đó nhận danh sách tất cả các chỉ mục của mỗi cột, tạo một khung dữ liệu từ các chỉ mục này, sau đó trả lại n hàng đầu tiên từ dataframe kết quả.

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) 

Returns:

X Y Z 
0 A J J 
1 B I I 
2 C H H 
Các vấn đề liên quan