Pandas SettingWithCopyWarning: я полностью сбит с толку - PullRequest
0 голосов
/ 03 мая 2020

Я получаю печально известную pandas SettingWithCopyWarning, когда я запускаю следующий сегмент кода:

for i in range(1, N):
    if df['deltaPressure'][i] < CLUSTER_THRESHOLD:
        df['Cluster'][i] = df['Cluster'][i-1]
    else:
        df['Cluster'][i] = df['Cluster'][i-1] + 1

Я попытался исправить это, добавив .copy () следующим образом:

for i in range(1, N):
    if df['deltaPressure'][i] < CLUSTER_THRESHOLD:
        df['Cluster'][i] = df['Cluster'][i-1].copy()
    else:
        df['Cluster'][i] = df['Cluster'][i-1].copy() + 1

К сожалению, я не получаю никаких изменений в предупреждении. Множество поисков в Google и поиска в StackOverflow ни к чему не приблизили меня к пониманию фундаментальной ошибки в моем синтаксисе или того, как я случайно создаю цепочку. Кажется, код работает правильно, но я не хочу игнорировать сообщения об ошибках в надежде, что они окажутся неактуальными.

Я был бы очень признателен, как за исправление моего кода, так и за простое объяснение почему .copy () не приносит мне пользы.

С уважением и огромной благодарностью заранее

Thomas Philips

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Проблема в том, что вы используете __setitem__ и __getitem__ одновременно:

  • df['Cluster']: __getitem__
  • _[i] = __setitem__

Как объяснено в https://tomaugspurger.github.io/modern-1-intro, "pandas не может гарантировать, что первый getitem вернет представление или копию базовые данные. Изменения будут внесены в то, что я назвал _ выше, результат getitem в 1. Но мы не знаем, что _ использует ту же память, что и наш оригинал " df.

Вместо этого вы должны использовать loc / iloc.

РЕДАКТИРОВАТЬ: Перечитывая ваш вопрос, я добавляю еще одну возможность для достижения того, что вы делаете без, для l oop:


import pandas as pd
import numpy as np
N = 100
CLUSTER_THRESHOLD = 50
df = pd.DataFrame({"deltaPressure": np.random.randint(1,100, N),
                   "Cluster": np.random.randint(1,5,N)})
df["top"] = df["deltaPressure"]<CLUSTER_THRESHOLD
df["Cluster"] = np.where(df["top"], df["Cluster"].shift(), df["Cluster"].shift() + 1)

Надеюсь, это поможет.

0 голосов
/ 03 мая 2020

Это действительно работает - хотя я должен сказать, что это совсем не интуитивно понятно, даже после того, как я некоторое время на него смотрю. Это действительно похоже на то, как реализован Pandas. Вооружившись вашим предложением и Google, я нашел исчерпывающий ответ на StackOverflow

Спасибо, мельница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...