我是pandas用户,我习惯于使用pandas函数进行方法链接,因为我认为可读性更好。在panda提供的函数中,assign在创建或更改数据帧的列时扮演着重要角色。
最近,我想知道assign
函数与普通赋值方法相比的性能。例如,
正常分配方法:
a = pd.DataFrame({'col0': [1, 2, 3], 'col1': ['i', 'j', 'k']})
a['col2'] = [7, 8, 9]
assign
功能:
b = pd.DataFrame({'col0': [1, 2, 3], 'col1': ['i', 'j', 'k']})
b = b.assign(col2 = [7, 8, 9])
这两种方式提供相同的输出。然而,当我观察它们与id()
的同一性时,它表明assign
方法实际上给出了一个新对象,而不是改变原始对象b
。例如,
a = pd.DataFrame({'col0': [1, 2, 3], 'col1': ['i', 'j', 'k']})
a_id_old = id(a)
a['col2'] = [7, 8, 9]
a_id_new = id(a)
b = pd.DataFrame({'col0': [1, 2, 3], 'col1': ['i', 'j', 'k']})
b_id_old = id(b)
b = b.assign(col2 = [7, 8, 9])
b_id_new = id(b)
print('For a, old id: {} and new id: {}'.format(a_id_old , a_id_new))
print('For b, old id: {} and new id: {}'.format(b_id_old , b_id_new))
我发现,如果我们使用assign
方法,它将给出一个不同的对象。官方文件还表示,这种方法将返回一个新对象。类似的事情也在这篇文章中讨论过。
我有两个问题:
- 由于
assign
方法将输出一个新对象,这是否一定意味着它将比普通赋值方法慢 - 有没有其他方法可以让我使用方法链接样式创建/更改列
我注意到pandas核心团队成员鼓励我们使用方法链接风格(请参阅此处和此处(。然而,assign
的"性能问题"现在让我很困惑是否使用它。
非常感谢!
考虑实验:
import time
a = pd.DataFrame({'col0': [1, 2, 3], 'col1': ['i', 'j', 'k']})
s = time.time()
for i in range(100000):
a['col2'] = [7, 8, 9]
e = time.time()
print('Simaple:', e-s)
b = pd.DataFrame({'col0': [1, 2, 3], 'col1': ['i', 'j', 'k']})
s = time.time()
for i in range(100000):
b = b.assign(col2 = [7, 8, 9])
e = time.time()
print('Using assign:', e-s)
输出:
Simaple: 7.7636802196502686
Using assign: 34.687790870666504