首先,我尝试编写一些类似于以下代码的代码:
import numpy as np
import pandas as pd
np.random.seed(2016)
train = pd.DataFrame(np.random.choice([np.nan, 1, 2], size=(10, 3)),
columns=['Age', 'SibSp', 'Parch'])
complete = train.dropna()
complete['AgeGt15'] = complete['Age'] > 15
获取SettingWithCopyWarning之后,我尝试使用.loc:
complete.loc[:, 'AgeGt15'] = complete['Age'] > 15
complete.loc[:, 'WithFamily'] = complete['SibSp'] + complete['Parch'] > 0
但是,我仍然收到相同的警告。是什么赋予了?
注意:自大熊猫0.24版本起,is_copy
已弃用该版本,并将在以后的版本中将其删除。当private属性_is_copy
存在时,下划线表示该属性不是公共API的一部分,因此不应依赖于此属性。因此,展望未来,沉默的唯一正确方法似乎SettingWithCopyWarning
是在全球范围内这样做:
pd.options.mode.chained_assignment = None
当complete = train.dropna()
执行时,dropna
可能会返回一个副本,因此出于谨慎考虑,Pandas设置complete.is_copy
为Truthy值:
In [220]: complete.is_copy
Out[220]: <weakref at 0x7f7f0b295b38; to 'DataFrame' at 0x7f7eee6fe668>
这样一来,Pandascomplete['AgeGt15'] = complete['Age'] > 15
便会在执行时警告您,您可能正在修改不会对起作用的副本train
。对于初学者来说,这可能是一个有用的警告。就您而言,您似乎无意通过Modify进行train
间接修改complete
。因此,警告对您而言只是毫无意义的烦恼。
您可以通过以下方式使警告静音:
complete.is_copy = False # deprecated as of version 0.24
这是不是让实际的复制更快,而且咬SettingWithCopyWarning
在萌芽状态(点这里_check_setitem_copy
被称为):
def _check_setitem_copy(self, stacklevel=4, t='setting', force=False):
if force or self.is_copy:
...
如果您真的有信心知道自己在做什么,则可以SettingWithCopyWarning
使用
pd.options.mode.chained_assignment = None # None|'warn'|'raise'
使警告静音的另一种方法是制作新副本:
complete = complete.copy()
但是,如果DataFrame很大,您可能不希望这样做,因为复制可能会花费大量时间和内存,并且如果您知道已经是副本,那么复制是毫无意义的(出于
警告警告的目的 除外)complete
。
对使用. locs进行索引/切片的赋值有一个一般性问题。 假设以下数据帧df: 要复制的代码: 我创建df1使用: 然后,我根据B中的值,使用以下公式为C赋值: 作业正常工作,但我收到一个SettingBackCopy警告。是我做错了什么,还是这是预期的功能?我认为使用. loc可以避免链式赋值。是不是我错过了什么?我正在使用熊猫14.1
所以我运行了一些示例: 类似于: 让我们使用和并确保得到相同的内容 这就是说,谁能提供关于方法可以做什么和不能做什么的指导呢?
假设我有下面的数据框,我想将
最近开始从我的安全地带(R)扩展到Python,我对中的单元格定位/选择感到有点困惑。我已经阅读了文档,但我很难理解各种本地化/选择选项的实际含义。 我是否有理由使用或而不是,以及,反之亦然?在什么情况下我应该使用哪种方法? 注意:以后的读者要知道,这个问题已经过时了,是在熊猫v0.20之前写的,当时有一个函数叫做。这个方法后来被分成两个-和-以明确区分位置索引和基于标签的索引。请注意,由于不一致
例如,我有一个数据框架: 我希望在时将value 1替换为。所以我想要的结果是: 我可以通过以下代码实现它: 我认为数据量大的时候速度太慢了。我通过<code>来尝试它。loc,但我不知道如何设置值。 我如何通过<code>实现它。loc或其他简单方法?提前谢谢。
我有以下问题:在df中,我想要选择特定的行和特定的列,在这个选择中,获取第一个元素,并为它们分配一个新值。我天真地认为以下代码应该可以完成这项工作: 和都应将视图返回到df中,并且应覆盖该值。但是,数据帧不会改变。为什么? 我知道如何绕过它--首先使用创建一个新的df,然后使用更改值并更新原始df(如下所示)。 但是a)我不认为这是最佳的,b)我想知道为什么顶级解决方案不起作用。为什么它返回一个副