【发布时间】:2022-03-19 11:06:55
【问题描述】:
我刚刚发现了用于 pandas 数据帧的 assign 方法,它看起来不错,并且与 R 中 dplyr 的 mutate 非常相似。但是,我总是通过“即时”初始化一个新列来解决问题。 assign 更好有什么原因吗?
例如(基于 pandas 文档中的示例),要在数据框中创建一个新列,我可以这样做:
df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
df['ln_A'] = np.log(df['A'])
但pandas.DataFrame.assign 文档建议这样做:
df.assign(ln_A = lambda x: np.log(x.A))
# or
newcol = np.log(df['A'])
df.assign(ln_A=newcol)
两种方法都返回相同的数据帧。事实上,第一种方法(我的“即时”分配)比.assign 方法(0.353 秒,1000 次迭代)快得多(0.202 秒,1000 次迭代)。
那么我是否有理由停止使用我的旧方法来支持df.assign?
【问题讨论】:
-
我认为这是风格问题
-
嗯,我知道的唯一原因是它允许方法链接。你可以做类似
df.assign(some_col=some_exp).some_other_method_involving_the_new_column() -
This issue 也支持它主要用于方法链。
-
它们在语义上是不同的。一个是就地修改,另一个不是。
-
旧版本
df['ln_A'] = np.log(df['A'])现在可以提高SettingWithCopyWarning