让我们开始的一些简单数据:
import pandas as pd
import numpy as np
df = pd.DataFrame({"x": np.random.normal(size=100), "y": np.random.normal(size=100)})
所以,到目前为止,我一直认为assign
相当于mutate
库中的dplyr
。但是,如果我尝试在同一assign
步骤中使用我在assign
步骤中创建的变量,则会出现错误。考虑以下内容,这在R中是可以接受的:
df %>%
mutate(z = x * y, w = z + 10)
如果我在pandas
中尝试等效,我会收到错误:
df.assign(z = df.x * df.y, w = z + 10) # Error
df.assign(z = df.x * df.y, w = lambda d: d.z + 10) # Error
我能想到的唯一方法是使用两个assign
步骤:
df.assign(z = df.x * df.y).assign(w = lambda d: d.z + 10)
有没有我错过的东西?或者是否有另一种更合适的功能?
答案 0 :(得分:3)
您可以使用DataFrame.eval(..., inplace=False)方法,如下所示:
<tbody>
{{#each student}}
<tr class="accordion-toggle mainRow"> <!--mainRow if want whole row to change green-->
<td>{{> expandButton}}</td>
<td>{{Name}}</td>
<td>{{PhoneNumber}}</td>
<td>{{VipID}}</td>
<td class="selectionChange">{{> buttonSelections}}</td>
</tr>
<tr>
<td colspan="12" class="hiddenRow">
<div class="accordian-body collapse" id="{{this._id}}">
<table class="table table-striped">
<thead id="innter-table">
<tr class="info">
<th id="inner-heading">Reason for Visit</th>
<th id="inner-heading">Current Major</th>
<th id="inner-heading">Intended Major</th>
<th id="inner-heading">Comments</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ReasonForVisit}}</td>
<td>{{CurrentMajor}}</td>
<td>{{IntendedMajor}}</td>
<td>{{Comments}}</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
{{> autoformModals}}
{{/each}}
</tbody>
答案 1 :(得分:2)
这些不等同。来自assign
的文档(强调我的):
可以在同一个分配中分配多个列,但无法引用在同一个分配调用中创建的其他列。
这在Python中很难做到&lt; 3.6因为关键字参数的顺序不能保证。使用多行DataFrame.eval
的{{3}}答案是解决问题的一种不错的替代方法。
还有一个GitHub问题
指出,自API: allow dependent assignment? #14207以来,您希望可以在Python 3.6中实现此行为。似乎pandas 2.0中可能会采用这种行为。
答案 2 :(得分:1)
我知道这是一个古老的问题,但是我相信熊猫现在可以进行此类操作:
df.assign(z = df.x * df.y, w = lambda d: d.z + 10)
至少已经阅读了文档的这一部分:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html
所以我想这取决于熊猫的版本!