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

时间:2018-01-09 23:01:09

标签: python pandas

我刚刚发现了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方法(1000次迭代的0.3526602769998135秒)明显更快(1000次迭代为0.20225788200332318秒)。

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

2 个答案:

答案 0 :(得分:9)

不同之处在于您是否希望修改现有框架,或创建新框架,同时保持原始框架不变。

特别是,DataFrame.assign会返回一个 new 对象,其中包含原始数据的副本以及所请求的更改...原始框架保持不变

在您的特定情况下:

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

现在假设您希望在不破坏A的情况下创建1无处不在df的新框架。然后你可以使用.assign

>>> new_df = df.assign(A=1)

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

答案 1 :(得分:1)

assign的前提是它返回:

  

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

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

  

可调用对象不得更改输入DataFrame(尽管pandas不会对其进行检查)。

另一方面,df['ln_A'] = np.log(df['A'])可以就地完成任务。


  

那么,有理由我应该停止使用我的旧方法来支持df.assign吗?

我认为您可以尝试df.assign,但是如果您进行需要大量存储的工作,则最好按照以前的操作或使用inplace=True进行操作。