为什么要使用pandas.assign而不是简单地初始化新列?

sac*_*cuL 12 python pandas

我刚刚发现了assignpandas数据帧的方法,它看起来很漂亮,与mutateR中的dplyr非常相似.但是,我总是通过"动态"初始化一个新列来获得.有什么理由assign更好吗?

例如(基于pandas文档中的示例),要在数据框中创建新列,我可以这样做:

df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
df['ln_A'] = np.log(df['A'])
Run Code Online (Sandbox Code Playgroud)

pandas.DataFrame.assign文档建议这样做:

df.assign(ln_A = lambda x: np.log(x.A))
# or 
newcol = np.log(df['A'])
df.assign(ln_A=newcol)
Run Code Online (Sandbox Code Playgroud)

两种方法都返回相同的数据帧.实际上,第一种方法(我的'即时'方法)比.assign方法(1000次迭代的0.3526602769998135秒)明显更快(1000次迭代为0.20225788200332318秒).

那么我有理由停止使用旧方法df.assign吗?

don*_*mus 15

不同之处在于您是希望修改现有帧还是创建新帧,同时保持原始帧的原样.

特别是,DataFrame.assign返回一个对象,该对象具有原始数据的副本以及请求的更改...原始帧保持不变.

在您的特定情况下:

>>> df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
Run Code Online (Sandbox Code Playgroud)

现在假设您希望创建一个新的框架,其中A无处不1df.然后你可以使用.assign

>>> new_df = df.assign(A=1)
Run Code Online (Sandbox Code Playgroud)

如果您不希望保持原始值,那么显然df["A"] = 1会更合适.这也解释了速度差异,必要时.assign必须复制数据而[...]不是.


pro*_*sti 7

前提assign是它返回:

除了所有现有列之外,还包含新列的新 DataFrame。

而且您也无法就地更改原始数据框。

可调用对象不得更改输入数据帧(尽管熊猫不检查它)。

另一方面df['ln_A'] = np.log(df['A'])会做事就地。


那么我是否有理由停止使用我的旧方法来支持df.assign

我认为你可以尝试,df.assign但如果你做内存密集型的事情,最好是你以前做过的工作或使用inplace=True.