Python Pandas добавление двух фреймов данных SettingWithCopyWarning - PullRequest
0 голосов
/ 04 февраля 2020

Я не понимаю, почему я получаю страшное предупреждение, когда делаю в точности так, как указано в официальной документации.

У нас есть dataframe с именем a

a = pd.DataFrame(data = [['Tom',1],
                         ['Tom',1], 
                         ['Dick',1], 
                         ['Dick',1], 
                         ['Harry',1],
                         ['Harry',1]], columns = ['Col1', 'Col2'])

a

Out[377]: 
    Col1  Col2
0    Tom     1
1    Tom     1
2   Dick     1
3   Dick     1
4  Harry     1
5  Harry     1

Сначала мы создаем «держатель» dataframe:

holder = a

Затем мы создаем подмножество a:

c = a.loc[a['Col1'] == 'Tom',:]

c

Out[379]: 
  Col1  Col2
0  Tom     1
1  Tom     1

Мы создаем другое подмножество d, которое будет добавлено ( срез of) к предыдущему подмножеству c, но как только мы попытаемся добавить d к c, мы получим предупреждение:

d = a.loc[a['Col1'] == 'Tom','Col2']

d

Out[389]: 
0    1
1    1


c.loc[:,'Col2'] += d

C:\Users\~\anaconda3\lib\site-packages\pandas\core\indexing.py:494: 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: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[item] = s

Я хотел бы понять, что я делаю неправильно, потому что я очень часто использую эту логику c (из R, где все не чертовски object)

1 Ответ

0 голосов
/ 05 февраля 2020

Заметив другую проблему, я нашел решение.

Всякий раз, когда вы говорите

dataframe_A = dataframe_B

, вам нужно действовать с осторожностью, потому что, похоже, Python соединяет эти два кадра данных с помощью бедра. Если вы внесете изменения в dataframe_B, ваш dataframe_A также изменится!

Я понимаю, что этого достаточно, чтобы решить проблему, используя .copy(deep=True), где python создаст полный и независимый Копировать, чтобы вы могли вносить изменения в один, не влияя на другой.

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

...