Python pandas удаление SettingWithCopyWarning
Итак, я создал пустой фреймворк с использованием
df=data[['ID','Matrix','Name','Country', 'Units']]
df['Value']=''
и я заполняю его таким кодом, который находит строки, содержащие значения "Хорошо", "Плохо" в df.Matrix
и заполняя их значениями в sch[i]
:
df.loc[df.Matrix.str.contains('Good'),'Value'] = sch[2]
df.loc[df.Matrix.str.contains('Bad'),'Value'] = sch[6]
df.loc[df.Matrix.str.contains('Excellent'),'Value'] = sch[8]
Я получаю кучу ошибок, таких как оба этих двух разных:
C:\Python33\lib\site-packages\pandas\core\strings.py:184: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
" groups, use str.extract.", UserWarning)
C:\Users\0\Desktop\python\Sorter.py:57: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
df.loc[df.Matrix.str.contains('Bad'),'Value'] = sch[6]
До сих пор я подавляю код, используя
pd.options.mode.chained_assignment = None
Если я не буду подавлять сообщения об ошибках, я получу около 20 из них. Есть ли другой формат, который я могу изменить, чтобы я не получил сообщение об ошибке?
Я использую python 3 и pandas 0.131, если он помогает
Ответы
Ответ 1
Вот хорошее объяснение того, почему это предупреждение было включено:
Pandas: Связанные назначения
Вы уверены, что это весь ваш код? Pls показывает все, что вы делаете.
In [13]: df = DataFrame(index=range(5))
In [14]: df['Value'] = ''
In [15]: df.loc[[1,4],'Value'] = 'bad'
In [16]: df.loc[[0,3],'Value'] = 'good'
In [17]: df
Out[17]:
Value
0 good
1 bad
2
3 good
4 bad
[5 rows x 1 columns]
Второй пример
In [1]: df = DataFrame(index=range(5))
In [2]: df['Value'] = ''
In [3]: df2 = DataFrame(dict(A=['foo','foo','bar','bar','bah']))
In [4]: df
Out[4]:
Value
0
1
2
3
4
[5 rows x 1 columns]
In [5]: df2
Out[5]:
A
0 foo
1 foo
2 bar
3 bar
4 bah
[5 rows x 1 columns]
In [6]: df.loc[df2.A.str.contains('foo'),'Value'] = 'good'
In [7]: df.loc[df2.A.str.contains('bar'),'Value'] = 'bad'
In [8]: df
Out[8]:
Value
0 good
1 good
2 bad
3 bad
4
[5 rows x 1 columns]
Ответ 2
Некоторые могут хотеть просто подавить предупреждение:
class SupressSettingWithCopyWarning:
def __enter__(self):
pd.options.mode.chained_assignment = None
def __exit__(self, *args):
pd.options.mode.chained_assignment = 'warn'
with SupressSettingWithCopyWarning():
#code that produces warning