Pandas. Как лучше добавлять новый столбец со значением в существующий DataFrame?

Вот пример, моделирующий ситуацию с предупреждением:

import pandas as pd
import numpy as np

df = pd.DataFrame({"col1": [1, 2, 3], "col2": ["a", "b", "a"]})

...    # do something

df1 = df[df.col2 == "a"]

df1["new_column"], df1["case"] = np.nan, ""

Этот вполне безобидный код делает то что нужно, и это подтверждается выводом в консоли:

df1
Out[16]: 
   col1 col2  new_column case
0     1    a         NaN     
2     3    a         NaN     

df
Out[17]: 
   col1 col2
0     1    a
1     2    b
2     3    a

Однако вылетеает забавное предупреждение, которое пугает своей непонятностью:

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 caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df1["new_column"], df1["case"] = np.nan, ""

Которое рекомендует делать что то по другому.
Два вопроса:

  • Почему то как я добавляю столбец - это плохо, судя по предупреждению
  • Как мне лучше добавлять столбец с заданным значением

Ответы (1 шт):

Автор решения: strawdog

Не смотря на то, что ошибка индицирует вот эту строку:

df1["new_column"], df1["case"] = np.nan, ""

корень проблемы у вас вот в этой строке:

df1 = df[df.col2 == "a"]

здесь вы создаете ссылку на срез датафрейма df. О чем вас и предупреждают. От вас требуется эксплицитно указать, работаете ли вы с ссылкой (view) или копией (copy). В вашем случае, одним из решений может быть явное создание копии df:

df1 = df[df.col2 == "a"].copy()
→ Ссылка