如何在与pandas相同的赋值函数中使用创建的变量

时间:2017-02-27 21:29:13

标签: python pandas

让我们开始的一些简单数据:

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)

有没有我错过的东西?或者是否有另一种更合适的功能?

3 个答案:

答案 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

所以我想这取决于熊猫的版本!