2015-06-30 18 views
1

我正在尝试调试一个慢速脚本,并且让我自己对大熊猫中不同操作的时间非常困惑。也许这里有很棒的文档,但我还没有找到它们。Pandas过滤,重命名和添加列的时间

我的测试脚本是:

import pandas as pd 
import numpy as np 
import datetime 

# Set up simple timing. 
times = [] 
labels = [] 
times.append(datetime.datetime.now()) 

# Build a dataframe. 
df = pd.DataFrame(np.random.rand(20000,2), columns=['x', 'y']) 
labels.append('Build DataFrame') 
times.append(datetime.datetime.now()) 

# Filter the dataframe. 
df = df[df.x > .5] 
labels.append('Filter') 
times.append(datetime.datetime.now()) 

# Rename some stuff. 
df.rename(
    columns={ 
     'x': 'X', 
     'y': 'Y', 
    }, inplace=True, copy=False 
) 
labels.append('Rename columns') 
times.append(datetime.datetime.now()) 

# Add a column. 
df['n'] = 1 
labels.append('Add column') 
times.append(datetime.datetime.now()) 

print(df) 

# Print out times in seconds. 
print([labels[i] + ': ' + str((times[i + 1] - times[i]).total_seconds() * 1000.0) 
     for i in range(len(times) - 1)]) 
print('Total: ' + str((times[-1] - times[0]).total_seconds() * 1000.0)) 

这给了我的时间:

['Build DataFrame: 1.19', 'Filter: 1.285', 
'Rename columns: 16.884', 'Add column: 0.724'] 

Total: 20.083 

如果我理解正确的重命名,我不应该被复制任何东西刚更新的名称,以便应该差不多谈没时间。如果我重新安排要获得的东西,这就诞生了。

['Build DataFrame: 1.613', 'Rename columns: 0.702', 
'Filter: 2.664', 'Add column: 18.002'] 

Total: 22.981 

然后Tt显示添加列一直在进行。再次重新安排,我已经让所有事情都变得超级快捷?

['Build DataFrame: 1.05', 'Rename columns: 0.364', 
'Add column: 0.921', 'Filter: 1.52'] 

Total: 3.855 

如果我使用DF [ 'M'] = np.random.rand添加另一列,此时(df.shape [0]),使得每个元件具有其自身的价值,我结束了。

['Build DataFrame: 1.015', 'Rename columns: 0.324', 
'Add column: 0.473', 'Filter: 1.247', 'Add column: 18.497'] 

Total: 21.556 

我可以通过在过滤器之前推动列添加来再次加快速度。

['Build DataFrame: 1.022', 'Rename columns: 0.439', 
'Add column: 0.51', 'Add column: 0.58', 'Filter: 4.192'] 

Total: 6.743 

显然,过滤和复制是这里唯一昂贵的操作,不管我做什么他们为了我得到一个一致的print(df)输出。

我对这里发生的事情的猜测是过滤器简单地存储了一个掩码,但实际上并没有强制拷贝直到它必须。通过添加一列我强制该副本。我不明白为什么重命名会强制该副本。

有没有办法手动强制该副本进行测试?

更新为完整性。 使用nitis`DF =(DF [df.X> 0.5])。拷贝()

['Build DataFrame: 0.989', 'Filter: 1.578', 'Rename columns: 0.362', 
'Add column: 0.441'] 
Total: 3.37 

顺便说一句我的 '高度科学' 定时系统具有1ms的〜的测量误差,所以这是在水平我关心的。

回答

1

尝试更换

df = df[df.X > .5] 

用,

df = (df[df.X > .5]).copy() 
+0

是的是的伟大工程,迫使副本给人以巨大的速度向上。 – TristanMatthews

相关问题