当我运行以下代码段时,我得到了臭名昭著的熊猫SettingWithCopyWarning:
for i in range(1, N):
if df['deltaPressure'][i] < CLUSTER_THRESHOLD:
df['Cluster'][i] = df['Cluster'][i-1]
else:
df['Cluster'][i] = df['Cluster'][i-1] + 1
我尝试通过添加.copy()来修复它,如下所示:
for i in range(1, N):
if df['deltaPressure'][i] < CLUSTER_THRESHOLD:
df['Cluster'][i] = df['Cluster'][i-1].copy()
else:
df['Cluster'][i] = df['Cluster'][i-1].copy() + 1
很遗憾,我对警告没有任何更改。大量的搜索和搜索StackOverflow使我无法进一步了解语法中的基本错误或我无意中如何进行链接。该代码似乎可以正确运行,但是我不想忽略错误消息,以希望它们与实际无关。
我很感激,既修复了我的代码,又简单解释了为什么.copy()对我不利。
衷心的感谢!
托马斯·飞利浦
答案 0 :(得分:2)
问题是您同时使用null
和__setitem__
:
__getitem__
:df['Cluster']
__getitem__
_[i] =
如https://tomaugspurger.github.io/modern-1-intro中所述,”熊猫无法保证第一个 getitem 返回的是视图还是基础数据的副本。更改将对我在上面所说的_是 getitem 在1中的结果。但是我们不知道_与我们的原始记忆具有相同的记忆力。 __setitem__
。
您应该改用df
/ loc
。
编辑:重新阅读您的问题,我添加了另一种可能的实现方式,而无需for循环:
iloc
希望有帮助。
答案 1 :(得分:0)
这确实有效-尽管我必须说,即使盯着它看了一会儿也不是很直观。它似乎确实与熊猫的实施方式有关。有了您的建议和Google,我在StackOverflow
上找到了全面的答案感谢磨坊。