我想将Pandas
DataFrame
中的值替换为大于任意数字(在本例中为100)NaN
的值(因为这个值很大,表示实验失败)。以前我用它来替换不需要的值:
sve2_all[sve2_all[' Hgtot ng/l'] > 100] = np.nan
但是,我收到以下错误:
-c:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
C:\Users\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\core\indexing.py:346: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s
从this StackExchange question开始,似乎有时可以忽略此警告,但我不能很好地跟进讨论,以确定这是否适用于我的情况。该警告是否基本上让我知道我将覆盖DataFrame
中的一些值?
编辑:据我所知,一切都表现得应有尽有。跟进是我取代非标准价值的方法吗?有没有更好的方法来替换价值观?
答案 0 :(得分:23)
根据错误消息的建议,您应该使用loc来执行此操作:
sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan
警告此处是为了阻止您修改副本(此处sve2_all[sve2_all[' Hgtot ng/l'] > 100]
可能一个副本,如果是,则任何修改都不会更改原始框架。可能是因为它在某些情况下可以正常工作,但是熊猫不能保证它在所有情况下都能正常工作......使用风险自负(考虑自己警告!;))。
答案 1 :(得分:2)
我在尝试重置整个DataFrame的内容时收到此警告但无法使用loc
或iloc
解决此问题:
df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning
但解析为包含数据的ndarray解决了问题:
df.values[:, :] = new_values # no warnings and desired behavior
答案 2 :(得分:2)
---问题解决了我---
当我尝试转换浮动时,我遇到了交战错误 - > int,即使我使用“.loc”命令。我的错误是我在操作之前过滤了我的dataFrame(带有掩码),因此转换仅发生在数据框项/列的一小部分中,结果是一个混合类型列,它创建了一个混淆。我通过在掩码之前转换数据帧来解决问题(数据过滤),我希望它会有所帮助。
答案 3 :(得分:1)
正如其他用户建议的那样,您可以尝试:
myindex = sve2_all[' Hgtot ng/l'] > 100
sve2_all.loc[myindex, 'yourcolumn'] = np.nan
请记住,如果在创建数据透视表(row
不支持的pivot_table pandas 0.16.0 #417
关键字)时遇到问题,则应使用索引和列的新语法而不是行和列。 https://github.com/yhat/ggplot/issues/417
另见:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy