Pandas索引与复制错误

时间:2015-08-27 14:52:55

标签: python pandas

我的数据框中有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

1 个答案:

答案 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将其作为单个实体来处理。此外,这种操作顺序可以明显更快,并且如果需要,可以对两个轴进行索引。