【问题标题】:Python lambda function with 2 dataframes具有 2 个数据帧的 Python lambda 函数
【发布时间】:2016-05-29 10:02:45
【问题描述】:

这是我的 Python 代码片段。这段代码完美地改变了dataframe X_real_zeros,但它也改变了X,为什么会这样?

X_real_zeros = X
for column in numeric_cols:
     X_real_zeros[column] = X[column].apply(lambda x: 0 if np.isnan(x) == 1 else x)

如果我应用这样的东西:

X['columnii'] = X[column].apply(lambda x: 0 if np.isnan(x) == 1 else x)

它不会改变初始数据帧 X 中的 X[column]。

【问题讨论】:

  • 谢谢大家!真的很管用。

标签: python pandas lambda dataframe apply


【解决方案1】:

问题在于这一行X_real_zeros = X,而不是仅仅分配你应该使用:

X_real_zeros = X.copy()

您可以参考why should I make a copy of a data frame in pandas了解更多信息。

【讨论】:

    【解决方案2】:

    当您执行X_real_zeros = X 时,您不会创建一个名为 X_real_zeros 的 X 副本,而是与您的名为 X_real_zeros 的数据帧创建一个新绑定,即 X 和 X_real_zeros 指向内存中的相同空间。它与列表或字典的工作方式相同,解决方案是使用显式副本。

    X_real_zeros = X.copy()
    

    【讨论】:

      【解决方案3】:

      当你分配时

      X_real_zeros = X
      

      X_real_zeros 被分配了对对象 X 的内部引用。因此,当 X_real_zeros 发生变异时,X 也会更改值。要安全地复制变量,请执行以下操作:

      X.copy()
      

      这将创建 X 的新副本,您将能够安全地更改 X_real_zeros。

      【讨论】:

        猜你喜欢
        • 2020-09-05
        • 2018-03-04
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多