在熊猫切片上设置值的正确方法[重复]
Posted
技术标签:
【中文标题】在熊猫切片上设置值的正确方法[重复]【英文标题】:Correct way to set value on a slice in pandas [duplicate] 【发布时间】:2016-10-16 22:16:25 【问题描述】:我有一个熊猫数据框:data.它有列 ["name", 'A', 'B']
我想做(和工作)的是:
d2 = data[data['name'] == 'fred'] #This gives me multiple rows
d2['A'] = 0
这会将 fred 行上的 A 列设置为 0。 我也做过:
indexes = d2.index
data['A'][indexes] = 0
但是,两者都给了我相同的警告:
/Users/brianp/work/cyan/venv/lib/python2.7/site-packages/pandas/core/indexing.py:128: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
熊猫要我怎么做?
【问题讨论】:
【参考方案1】:这是来自 pandas 的一个非常常见的警告。这意味着您正在写入副本切片,而不是原始数据,因此由于链式分配混乱,它可能不适用于原始列。请阅读此post。它对此SettingWithCopyWarning
进行了详细讨论。在你的情况下,我认为你可以尝试
data.loc[data['name'] == 'fred', 'A'] = 0
【讨论】:
我正要发布同样的内容。合乎逻辑的“单行”比不必要的行要好。 很多人说这是正确的方法,我也是这样。但是,有时我还是会收到警告,说我正在为副本设置值,并建议我在使用时使用 .loc。有人遇到过同样的事情吗? @CalvinKu,是的!当我做它要求我做的事情时,我得到了同样的警告! IMO,这是一种模棱两可的行为,应该被视为一个错误,但 Pandas 人已经厌倦了听到它,所以我不太相信它会得到解决……真可惜……尤其是来自 R。跨度> 有趣的是,有时我得到了这个,无论我如何重构它都不会消失。但是当我一段时间后再次运行相同的代码时,警告就消失了。我猜这部分 pandas 的实现不是很健壮,所以你偶尔会看到这样的误报。但让我感到困扰的是,这似乎并没有发生在某些人身上,所以他们确信是你的代码错了……哈哈 @CalvinKu,当您分配的数据框是另一个数据框的视图时,就会发生这种情况。例如考虑代码: a = pd.DataFrame('x':[1],'y':[1]); b = a[['x']]; b.loc[:,'x'] = 0 。在这里,您将收到一个带有复制警告的设置,通知您更改了 b 的值,但没有更改 a。以上是关于在熊猫切片上设置值的正确方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]