【问题标题】:Pandas Indexing vs Copy Error熊猫索引与复制错误
【发布时间】:2015-11-22 00:48:41
【问题描述】:

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

【问题讨论】:

    标签: python pandas


    【解决方案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 可以将其作为一个整体来处理。此外,这种操作顺序可以显着加快,并且可以根据需要对两个轴进行索引。

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2016-09-23
      • 2019-05-03
      • 2018-02-03
      • 2018-06-17
      • 2019-10-28
      • 2018-07-13
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多