Python view vs copy error хочет, чтобы я использовал .loc только в скрипте - PullRequest
0 голосов
/ 10 мая 2018

Я запускаю длинный скрипт с кадром данных df. при запуске сценария, построении и изменении df столбец за столбцом, я снова и снова получаю эту ошибку в командной строке:

Значение пытается быть установлено для копии среза из DataFrame. Пытаться используя вместо этого .loc [row_indexer, col_indexer] = значение. См. предостережения в документация: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Но тогда он напечатает строку, которая вызывает предупреждение, и это не будет похоже на проблему. Строки, подобные приведенным ниже, будут вызывать его (каждая строка запускает его отдельно):

df['ZIP_DENS'] = df['ZIP_DENS'].astype(str)
df['AVG_WAGE'] = df['AVG_WAGE'].astype(str).apply(lambda x:x if x != 'nan' else 'unknown')
df['TERM_BIN'] = df['TERMS'].map(terms_dict)
df['LOSS_ONE'] = 'T_'+ df['TERM'].astype(str) +'_C_'+ df['COMP'].astype(str) + df['SIZE']
# this one's inside a loop:
df[i + '_BIN'] = df[i + '_BIN'].apply(lambda x:x if x != 'nan' else 'unknown')

Есть несколько примеров мутаций, которые я делаю на кадре данных. Теперь, это предупреждение только начало появляться, но я не могу воссоздать эту проблему в интерпретаторе. Когда я открываю терминал, я пытаюсь сделать что-то подобное, и это не дает мне никаких предупреждений:

import pandas as pd
df = pd.DataFrame([list('ab'),list('ef')],columns=['first','second'])
df['third'] = df[['first','second']].astype('str')

Есть ли что-то, чего я упускаю, что-то, чего я не понимаю в природе DataFrames, о которой пытается предупредить это предупреждение? Как вы думаете, возможно, я что-то сделал с этим фреймом данных в начале скрипта, а затем все последующие мутации объекта являются мутациями в представлении или его копии, или происходит что-то странное?

1 Ответ

0 голосов
/ 10 мая 2018

Как я уже упоминал в своем комментарии, вероятная проблема заключается в том, что где-то вверх по потоку в вашем коде вы назначили часть какого-то другого pd.DataFrame на df. Это частая причина путаницы, которая также объясняется в разделе «почему происходит присвоение, сбой при использовании цепочки-индексирование» в ссылке, которую упоминает Warning.

Минимальный пример:

data = pd.DataFrame({'a':range(7), 'b':list('abcccdb')})
df = data[data.a % 2 == 0]  #making a subselection of the DataFrame  
df['b'] = 'b'

/ Главная / пользователь / miniconda3 / envs / myenv / Библиотека / python3.6 / сайт-пакеты / ipykernel_launcher.py: 1: SettingWithCopyWarning: значение пытается быть установлено для копии срез из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy "" "Точка входа для запуска ядра IPython.

Обратите внимание, что этот раздел:

df = data[data.a % 2 == 0]  #making a subselection of the DataFrame  
df['b'] = 'b'

можно так же переписать так:

data[data.a % 2 == 0]['b'] = 'b'  #obvious chained indexing  
df = data[data.a % 2 == 0]

Правильный способ записи этого бита следующий:

data = pd.DataFrame({'a':range(7), 'b':list('abcccdb')})
df = data.loc[data.a % 2 == 0].copy()  #making a copy of the subselection   
df.loc[:,'b'] = 'b'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...