2015-06-25 4 views
0

По моему другому вопросу: Python Anaconda: how to test if updated libraries are compatible with my existing code?питон панды 0.16: SettingWithCopyWarning неправильно сообщили

Я проклинаю день, когда я был вынужден перейти на панду 0.16. Одна из вещей, которые я не понимаю, почему я получаю предупреждение о прикован присваивания, когда я делаю что-то, как банальное, как добавление нового поля в существующей dataframe и инициализации его с 1:

mydataframe['x']=1 

вызывает следующее предупреждение :

SettingWithCopyWarning: значение пытается установить на копии среза от DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

Смотрите на предостережений в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy mydataframe [ 'х'] = 1

Я понимаю, что могут быть проблемы при назначении значения в копию фрейма данных, но здесь я просто добавляю новое поле в dataframe! Как я должен изменить свой код (который отлично работал в предыдущих версиях панд)?

+0

если вы не обеспечивают полностью автономный пример, мы не можем сказать, является ли это ошибка или, если это то, что вы игнорировали документацию в течение длительного времени, и это только теперь выяснилось. – DSM

+0

Я привел пример. Я загружаю dataframe, а затем одну строку кода, которую я скопировал выше: mydataframe ['x'] = 1 - это тот, который вызывает предупреждение. –

+0

Извините, но если 'mydataframe'реально является вашим исходным df, а не копией или фрагментом/тогда это предупреждение не появится, также SO * действительно * правильное место, чтобы стонать об этом? Разве вы не должны размещать что-то на [github] (https://github.com/pydata/pandas/issues) предпочтительно с помощью MVCE? – EdChum

ответ

1

Произошла попытка ответить или, по крайней мере, попытаться воспроизвести сообщение. (Обратите внимание, что вы можете только получить это сообщение один раз и, возможно, потребуется, чтобы начать новую оболочку или сделать %reset в IPython, чтобы получить это сообщение.)

In [1]: %reset 

Once deleted, variables cannot be recovered. Proceed (y/[n])? y 

In [2]: import pandas as pd 

In [3]: pd.__version__ 
Out[3]: '0.16.0' 

Вот 3 вариации установки нового столбца в «1». Первые два не генерируют предупреждение, но третий делает. (Второй один благодаря @ предложение Джеффа)

In [4]: df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
    ...: df['z'] = 1 

In [5]: df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
    ...: df = df[1:] 
    ...: df['z'] = 1 

In [6]: df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
    ...: df2 = df[1:] 
    ...: df2['z'] = 1 

-c:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable 
/indexing.html#indexing-view-versus-copy 

Возможно, другие могут исправить меня, если я ошибаюсь, но я считаю, что сообщение об ошибке здесь в связи с df2 быть копией кусочка df. Однако, это на самом деле не проблема, так как в результате df и df2 это то, что я ожидал бы:

In [7]: df 
Out[7]: 
    x y 
0 1 77 
1 2 88 
2 3 99 

In [8]: df2 
Out[8]: 
    x y z 
1 2 88 1 
2 3 99 1 

Я знаю, что это будет страшно сказать, но когда я получаю это сообщение, я просто проверить, является ли команда сделала то, что хотела или не хотела, и не задумывалась над предупреждением. Но получаете ли вы предупреждение или нет, проверяя, что команда сделала то, что вы ожидали, - это то, что вам нужно делать все время в пандах (или в Matlab, или R, или SAS, или Stata, ...)

+0

обратите внимание, что если во второй части примера, если вы выполните: '' df = df [1:]; df ['z'] = 1''. вы НЕ получите предупреждение (возможно, также покажите это). Предупреждение происходит из-за установки столбца на то, что разрезано, THEN set, IOW, его дефактор так же, как '' df [1:] ['z'] = 1'' и ожидает его работы. – Jeff

+0

@Jeff Спасибо, я добавил ваше предложение к коду. Пожалуйста, напишите более полный ответ, если вы так склонны. Я не понимаю этого полностью и просто пытаюсь помочь решить проблему. – JohnE

+0

у вас есть хорошее объяснение. – Jeff

0

Это не будет генерировать предупреждение:

df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
df2 = df[1:].copy() 
df2['z'] = 1 
+0

.... но имеет ли это желаемое поведение? –

Смежные вопросы