Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过键盘输入大熊猫以最快的方式获得最大的体重_Python_Pandas_Performance - Fatal编程技术网

Python 通过键盘输入大熊猫以最快的方式获得最大的体重

Python 通过键盘输入大熊猫以最快的方式获得最大的体重,python,pandas,performance,Python,Pandas,Performance,给定一个包含3列的数据框:['User'、'Feature'、'Value']。我需要为每个用户获取TOP-N功能 我尝试了几个选项,但都太慢了。熊猫最大的方法实际上似乎比手工制作的方法慢,如以下代码所示: import pandas as pd

给定一个包含3列的数据框:
['User'、'Feature'、'Value']
。我需要为每个用户获取TOP-N功能

我尝试了几个选项,但都太慢了。熊猫最大的方法实际上似乎比手工制作的方法慢,如以下代码所示:

import pandas as pd                                                                                                                                                                                         
import numpy as np                                                                                                                                                                                          
import time                                                                                                                                                                                                 

np.random.seed(0)                                                                                                                                                                                           

max_rows = 1000000                                                                                                                                                                                          
n_users = 10000                                                                                                                                                                                             
max_entries = 100                                                                                                                                                                                           

df = pd.DataFrame()                                                                                                                                                                                         
df['Value'] = [i *  0.1 for i in range(max_rows)]                                                                                                                                                           
df['User'] = ['u%i'%i  for i in np.random.randint(0, n_users, size=max_rows)]                                                                                                                               
df['Feature'] = ['f%i'%i for i in range(max_rows)]                                                                                                                                                          

# PART 1                                                                                                                                                                                                    
t0 = time.time()                                                                                                                                                                                            
dfg = df.groupby(['User', 'Feature'], sort=False, as_index=True).sum()                                                                                                                                      
t1 = time.time()                                                                                                                                                                                            
print "first groupby takes: ", t1-t0,  "for nrows=", max_rows                                                                                                                                               


# PART 2                                                                                                                                                                                                    
#Option1                                                                                                                                                                                                    
dfg2 = dfg.groupby(dfg.index.get_level_values(0),                                                                                                                                                           
                   group_keys=False,                                                                                                                                                                        
                   sort=False).apply(lambda x: x.sort_values('Value', ascending=False).\                                                                                                                    
                                     iloc[:max_entries])                                                                                                                                                    
t2 = time.time()                                                                                                                                                                                            
print "second groupby takes:", t2-t1                                                                                                                                                                        


# PART 2                                                                                                                                                                                                    
#Option2                                                                                                                                                                                                    
dfg = dfg.reset_index(level='Feature')                                                                                                                                                                      
dfg3 = dfg.groupby(dfg.index.get_level_values(0), sort=False, group_keys=False).\                                                                                                                           
       apply(lambda x: x.nlargest(max_entries, 'Value'))                                                                                                                                                    
t3 = time.time()                                                                                                                                                                                            
print "Third groupby takes", t3-t2                                                                                                                                                                          
示例输出:

n [29]: first groupby takes:  0.914537191391 for nrows= 1000000                                                                                                                                            
second groupby takes: 17.5580070019                                                                                                                                                                         
Third groupby takes 59.3013348579                                                                                                                                                                           
有没有办法让它更快?像这样的问题我应该避开熊猫吗


还有为什么NLAGEST这么慢?我原以为会快一点

您可以使用
head

您的解决方案1

%timeit dfg.groupby(dfg.index.get_level_values(0),group_keys=False,sort=False).apply(lambda x: x.sort_values('Value', ascending=False).iloc[:max_entries])    
1 loop, best of 3: 9.1 s per loop

我的解决方案

%timeit dfg.sort_values('Value',ascending=False).groupby(level=0).head(max_entries)
1 loop, best of 3: 201 ms per loop

您可以使用
head

您的解决方案1

%timeit dfg.groupby(dfg.index.get_level_values(0),group_keys=False,sort=False).apply(lambda x: x.sort_values('Value', ascending=False).iloc[:max_entries])    
1 loop, best of 3: 9.1 s per loop

我的解决方案

%timeit dfg.sort_values('Value',ascending=False).groupby(level=0).head(max_entries)
1 loop, best of 3: 201 ms per loop

看起来很棒。在接受答案之前,我想看看是否有人有更快的方法来做这件事,这看起来很棒。在接受答案之前,我想看看是否有人有更快的方法