加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:05:19 所属栏目:Python 来源:网络整理
导读:我刚刚发现了pandas数据帧的assign方法,它看起来不错,与R中的dplyr的mutate非常相似.但是,我总是通过“动态”初始化一个新列来获得.分配是否更好? 例如(基于pandas文档中的示例),要在数据框中创建新列,我可以这样做: df = DataFrame({'A': range(1,11),'B'
我刚刚发现了pandas数据帧的assign方法,它看起来不错,与R中的dplyr的mutate非常相似.但是,我总是通过“动态”初始化一个新列来获得.分配是否更好?

例如(基于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吗?

解决方法

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

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

在您的特定情况下:

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读