试图弄清楚为什么下面的函数返回可怕的SettingBackCopyWarning
...这是我的函数,它打算通过引用修改数据框df
。
def remove_outliers_by_group(df, cols):
"""
Removes outliers based on median and median deviation computed using cols
:param df: The dataframe reference
:param cols: The columns to compute the median and median dev of
:return:
"""
flattened = df[cols].as_matrix().reshape(-1, )
median = np.nanmedian(flattened)
median_dev = np.nanmedian(np.abs(flattened) - median)
for col in cols:
df[col] = df[col].apply(lambda x: np.nan if get_absolute_median_z_score(x, median, median_dev) >= 2 else x)
不符合要求的行是df[col]=df[col].apply(lambda x:np.nan,如果获得绝对中位数z_分数(x,中位数,中位数)
试图在数据帧切片的副本上设置值。尝试改用.loc[row\u indexer,col\u indexer]=value
请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-查看与复制df[col]=df[col]。应用(λx:np.nan,如果获得绝对值、中位数、中位数、偏差)
我不明白的是,我到处都能看到这种模式,使用类似于
df['a']=df['a'].apply(lambda x:…)
,所以我无法想象他们都做错了。
我做错了吗?最好的方法是什么?我想修改原始数据帧。
谢谢你的帮助。
问题是由于重新分配,而不是因为您使用了apply
。
SettingBackCopyWarning
是在赋值中检测到链式索引的警告。这并不一定意味着出了什么问题。
为了避免警告,建议使用如下.loc
df.loc[:,col]=df[col].应用(…)
确保df是否是另一个数据帧的副本。在这种情况下,您应该像这样编写代码
df=df_test.copy()
这将确保df是副本而不是视图。
从以下链接了解有关此警告的更多信息
https://www.youtube.com/watch?v=4R4WsDJ-KVc
我试图在将数据帧与另一个数据帧合并后更改数据帧中的值,并遇到一些问题(在合并之前似乎不是问题)。 我正在索引和更改数据帧中的值: 随后,我使用merge连接了两个索引(左外连接)(我意识到left.join(右)也可以)。此后,当我使用iloc执行相同的值分配时,我收到以下警告: 对链接文档的审查不会澄清理解,因此,我是否使用了错误的iloc切片方法?(请记住,出于代码的目的,我需要基于位置的切片
对使用. locs进行索引/切片的赋值有一个一般性问题。 假设以下数据帧df: 要复制的代码: 我创建df1使用: 然后,我根据B中的值,使用以下公式为C赋值: 作业正常工作,但我收到一个SettingBackCopy警告。是我做错了什么,还是这是预期的功能?我认为使用. loc可以避免链式赋值。是不是我错过了什么?我正在使用熊猫14.1
我想用替换大于任意数字(本例中为100)的
问题内容: 我有两列,将集存储在数据框中。 我想使用快速向量化操作在两列上执行集合并集 但是错误使我无法这样做,因为我在两列中都输入了内容。 有解决这个问题的好方法吗? 问题答案: 对于这些操作,纯Python可能更有效。 如果我们可以使用,则可能会花费一半的时间(继承可能不值得): 时序的DataFrame:
问题内容: 假设我用两列(一个DateTime)和一个(整数)创建了一个熊猫DataFrame 。现在,我想根据第一列()中的值创建一个DatetimeIndex : 一切似乎都正常,除了我打印DataFrame时,它说它具有Int64Index。 我是在做错事还是不正确理解Indeces的概念? 问题答案: 没有就位(除非您通过)。否则一切正确 同样作为参考,在即将到来的0.12版本(下周)中,
查看以下: 问题是它不会在ipython笔记本中按默认值打印所有行,但我必须切片才能查看结果行。即使以下选项也不会更改输出: 有人知道如何显示整个阵列吗?