在熊猫切片上设置值的正确方法[重复]

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 的切片副本上设置一个值 [重复]

具有重复值的 Python 多索引切片

Groupby - 具有重复值的熊猫 df 计数