除了"分配"之外,我们还有其他 pandas 方法可以用来创建/更改列吗?



我是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方法,它将给出一个不同的对象。官方文件还表示,这种方法将返回一个新对象。类似的事情也在这篇文章中讨论过。

我有两个问题:

  1. 由于assign方法将输出一个新对象,这是否一定意味着它将比普通赋值方法慢
  2. 有没有其他方法可以让我使用方法链接样式创建/更改列

我注意到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

最新更新