2017-08-28 51 views
-1

我寻求帮助,以优化功能。循环尽管大熊猫据帧列,排序,并返回前N个结果

数据为例(user_id是数据帧指数):

df = 

user_id 670334 670336 670337 670338 670339 
670334 1.000000 0.995996 0.975368 0.995816  NaN 
670336 0.995996 1.000000 0.990686 0.999739  NaN 
670337 0.975368 0.990686 1.000000 0.990595  NaN 
670338 0.995816 0.999739 0.990595 1.000000  NaN 

我期待独立承担每一列,排序,上去下来,然后返回200强user_ids的列表。以下是我到目前为止,但我的矩阵超过8K x 8K数据点。

#example function 
def temp(df, N, column_head): 

    #Saves only the info about the user 
    xx = df[column_head] 

    #Sorts descending removing NaN's 
    data = xx.dropna().sort_values(ascending=False) 

    #Returns user at hand and list of top 200 ids 
    return column_head, list(data.index[1:N+1]) 

然后我使用列表理解

[temp(df, 200, x) for x in list(df.columns)] 

是否有更好的方法来做到这一点?它完成了这项工作,但我觉得有一种更加pythonic的方式来做到这一点。

预先感谢您。

回答

3

使用您所提供的数据,这里有一种方式来获得顶部n

i = df.index.values 
v = df.values 
n = 3 
pd.DataFrame(i[v.argsort(0)[::-1]][:n], columns=df.columns) 

    670334 670336 670337 670338 670339 
0 670334 670336 670337 670338 670338 
1 670336 670338 670336 670336 670337 
2 670338 670334 670338 670334 670336 
+0

Beatuiful ..!谢谢 – user2938093

2

您可以使用nlargest作为记录here。例如,您可以编辑如下代码:

results = [list(df[x].nlargest(200).index) for x in list(df.columns)] 
+0

这种方法也做的工作,谢谢!我只需要user_id而不是返回值。其下面的完成 [列表(DF [X] .nlargest(200)的.index)为X的列表(df.columns) – user2938093

+0

@ user2938093你是对的,我的索引部分错过。 – MedAli