当前位置: 首页 > 面试题库 >

如何处理Pandas中的SettingWithCopyWarning

解阳荣
2023-03-14
问题内容

背景
我刚刚将熊猫从0.11升级到0.13.0rc1。现在,该应用程序会弹出许多新警告。其中之一是这样的:

E:\FinReporter\FM_EXT.py:449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
  quote_df['TVol']   = quote_df['TVol']/TVOL_SCALE

我想知道这到底是什么意思?我需要改变什么吗?

如果我坚持使用该如何警告quote_df[‘TVol’] = quote_df[‘TVol’]/TVOL_SCALE?

产生错误的功能

def _decode_stock_quote(list_of_150_stk_str):
    """decode the webpage and return dataframe"""

    from cStringIO import StringIO

    str_of_all = "".join(list_of_150_stk_str)

    quote_df = pd.read_csv(StringIO(str_of_all), sep=',', names=list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg')) #dtype={'A': object, 'B': object, 'C': np.float64}
    quote_df.rename(columns={'A':'STK', 'B':'TOpen', 'C':'TPCLOSE', 'D':'TPrice', 'E':'THigh', 'F':'TLow', 'I':'TVol', 'J':'TAmt', 'e':'TDate', 'f':'TTime'}, inplace=True)
    quote_df = quote_df.ix[:,[0,3,2,1,4,5,8,9,30,31]]
    quote_df['TClose'] = quote_df['TPrice']
    quote_df['RT']     = 100 * (quote_df['TPrice']/quote_df['TPCLOSE'] - 1)
    quote_df['TVol']   = quote_df['TVol']/TVOL_SCALE
    quote_df['TAmt']   = quote_df['TAmt']/TAMT_SCALE
    quote_df['STK_ID'] = quote_df['STK'].str.slice(13,19)
    quote_df['STK_Name'] = quote_df['STK'].str.slice(21,30)#.decode('gb2312')
    quote_df['TDate']  = quote_df.TDate.map(lambda x: x[0:4]+x[5:7]+x[8:10])

    return quote_df

更多错误讯息


E:\FinReporter\FM_EXT.py:449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
  quote_df['TVol']   = quote_df['TVol']/TVOL_SCALE
E:\FinReporter\FM_EXT.py:450: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
  quote_df['TAmt']   = quote_df['TAmt']/TAMT_SCALE
E:\FinReporter\FM_EXT.py:453: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
  quote_df['TDate']  = quote_df.TDate.map(lambda x: x[0:4]+x[5:7]+x[8:10])

问题答案:

在SettingWithCopyWarning被创造的标志可能造成混淆的“链接”的任务,比如下面这并不总是按预期方式工作,特别是当第一选择返回一个副本。

df[df['A'] > 2]['B'] = new_val  # new_val not set in df

该警告提出了如下重写建议:

df.loc[df['A'] > 2, 'B'] = new_val

但是,这不适合您的用法,相当于:

df = df[df['A'] > 2]
df['B'] = new_val

显然,您不关心将其写回到原始框架的操作(因为您正在覆盖对它的引用),但是不幸的是,这种模式无法与第一个链式分配示例区分开。因此,(误报)警告。如果您想进一步阅读,可能会在建立索引的文档中解决误报的可能性。您可以通过以下分配安全地禁用此新警告。

import pandas as pd
pd.options.mode.chained_assignment = None  # default='warn'


 类似资料:
  • 问题内容: 背景 我刚刚将Pandas从0.11升级到0.13.0rc1。现在,该应用程序弹出许多新警告。其中之一是这样的: 我想知道到底是什么意思?我需要改变什么吗? 如果我坚持使用该如何警告 产生错误的函数 更多错误讯息 问题答案: 在被创造的标志可能造成混淆的“链接”的任务,比如下面这并不总是如预期的工作,特别是当第一选择返回一个副本。[ 有关背景讨论,请参见GH5390和GH5597。]

  • 本文向大家介绍在Pandas中处理NaN值的方法,包括了在Pandas中处理NaN值的方法的使用技巧和注意事项,需要的朋友参考一下 关于NaN值 -在能够使用大型数据集训练学习算法之前,我们通常需要先清理数据, 也就是说,我们需要通过某个方法检测并更正数据中的错误。 - 任何给定数据集可能会出现各种糟糕的数据,例如离群值或不正确的值,但是我们几乎始终会遇到的糟糕数据类型是缺少值。 - Pandas

  • 主要内容:为什么会存在缺失值?,什么是稀疏数据?,缺失值处理,检查缺失值,缺失数据计算,清理并填充缺失值,删除缺失值在一些数据分析业务中,数据缺失是我们经常遇见的问题,缺失值会导致数据质量的下降,从而影响模型预测的准确性,这对于机器学习和数据挖掘影响尤为严重。因此妥善的处理缺失值能够使模型预测更为准确和有效。 为什么会存在缺失值? 前面章节的示例中,我们遇到过很多 NaN 值,关于缺失值您可能会有很多疑问,数据为什么会丢失数据呢,又是从什么时候丢失的呢?通过下面场景,您会得到答案。 其实在很多时

  • 问题内容: 在开发高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由来自JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载

  • 问题内容: 在开发一个高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载

  • 本文向大家介绍如何处理硒中的帧?,包括了如何处理硒中的帧?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助以下方法来处理Selenium中的帧- switchTo()。frame(frameNumber) 此方法使用帧ID作为参数。框架ID的索引从0开始。如果未找到框架,则会引发NoSuchFrameException。 switchTo()。frame(frameName) 此方法使用开发