我的数据框中有Data2列。我试图通过将过滤器应用于Data2列来创建一个新列('NewCol')。下面的代码工作,新列的结果是正确的。但是在运行代码时出现以下错误消息。我怎样才能解决这个问题?我认为这会影响表现。
C:\ Python27 \ lib \ site-packages \ IPython \ kernel__main __。py:2:SettingWithCopyWarning: 尝试在DataFrame
的切片副本上设置值请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
# In[1]:
import pandas as pd
import numpy as np
from pandas import DataFrame
# In[2]:
df = pd.DataFrame({'Date': ['2015-05-08', '2015-05-07', '2015-05-06', '2015-05-05', '2015-05-08', '2015-05-07', '2015-05-06', '2015-05-05'], 'Sym': ['aapl', 'aapl', 'aapl', 'aapl', 'aaww', 'aaww', 'aaww', 'aaww'], 'Data2': [11, 8, 10, 15, 110, 60, 100, 40],'Data3': [5, 8, 6, 1, 50, 100, 60, 120]})
# In[4]:
df['NewCol'] = ''
df['NewCol'][df['Data2']> 60] = 'True'
df
答案 0 :(得分:1)
尝试使用.loc
df.loc[df['Data2']> 60, 'NewCol'] = 'True'
Pandas在内存管理方面非常有效。对于大多数操作(过滤器),它返回对已存在于内存中的数据(DataFrame)的引用。但是在某些情况下,它必须复制并返回此内容。此副本上的任何分配都不会反映在原始DataFrame中。因此警告。
同样对于所有切片,如果基于整数位置切片基于索引值和.loc
切片,请尝试使用.iloc
。在某些情况下,这更快,如documentation
使用dfmi切片['one'] ['second']时 ... dfmi ['one']选择列的第一级并返回单索引的数据帧。然后另一个python操作dfmi_with_one ['second']选择由'second'发生的索引系列。这由变量dfmi_with_one表示,因为pandas将这些操作视为单独的事件。例如单独调用 getitem ,因此必须将它们视为线性操作,它们会一个接一个地发生。
将此与df.loc [:,('one','second')]对比,它将(slice(None),('one','second'))的嵌套元组传递给单个调用<强>的GetItem 即可。这允许pandas将其作为单个实体来处理。此外,这种操作顺序可以明显更快,并且如果需要,可以对两个轴进行索引。