Получение предупреждения при обновлении столбца с использованием .loc [row_indexer, col_indexer] = значение - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь выполнить очистку полученных данных.

Код выглядит следующим образом:

import pandas as pd

def cleanup(df: pd.DataFrame) -> pd.DataFrame:
    # Remove entries from the IT dept
    mask = (df['dept'] != 'IT')
    df = df[mask]

    # Rename the dept from marketing to comms for the remaining rows
    mask = df['dept'] == 'marketing'
    df.loc[mask, 'dept'] = "comms"
    # The warning occurs here...

    # Rename the dept from accounting to finance for the remaining rows
    mask = df['dept'] == 'accounting'
    df.loc[mask, 'dept'] = 'finance'

    return df

data = [[1,"marketing"],[2,"accounting"],[3,"marketing"],[4,"IT"],[5,"IT"],[6,"board"]]
df = pd.DataFrame(data, columns = ['id', 'dept'])
df=cleanup(df)

Я получаю следующее предупреждение:

/ opt / conda / lib / python3.7 / site-packages / pandas / core / indexing.py: 480: SettingWithCopyWarning: пытается установить значение для копии фрагмента из DataFrame.Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение

См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self.obj [item] = s

I 'Я немного обеспокоен этим предупреждением, поскольку возвращаемые данные являются правильными , а документация в данном случае, похоже, не применима.

Что-то не так с моим кодом?Или я могу безопасно проигнорировать предупреждение?

1 Ответ

0 голосов
/ 27 сентября 2019

Ошибка говорит об этом.Ваш df - это фрагмент другого кадра df=df[mask].Попробуйте обновить оригинальный кадр, а не срез:

def cleanup(df: pd.DataFrame) -> pd.DataFrame:
    # Remove entries from the IT dept
    mask1 = (df['dept'] != 'IT')

    # Rename the dept from marketing to comms for the remaining rows
    mask2 = df['dept'] == 'marketing'
    df.loc[mask1 & mask2, 'dept'] = "comms"
    # The warning occurs here...

    # Rename the dept from accounting to finance for the remaining rows
    mask2 = df['dept'] == 'accounting'
    df.loc[mask1&mask2, 'dept'] = 'finance'

    return df

data = [[1,"marketing"],[2,"accounting"],[3,"marketing"],[4,"IT"],[5,"IT"],[6,"board"]]
df = pd.DataFrame(data, columns = ['id', 'dept'])
df=cleanup(df)

Измененная функция возвращает новые df со значениями IT в dept.Если, на самом деле, вам не нужны эти записи, вы можете сделать копию и обновить это:

def cleanup(df: pd.DataFrame) -> pd.DataFrame:
    # Remove entries from the IT dept
    mask = (df['dept'] != 'IT')

    # we copy the data frame here so it's no longer a slice
    df = df[mask].copy()  

    # Rename the dept from marketing to comms for the remaining rows
    mask = df['dept'] == 'marketing'
    df.loc[mask, 'dept'] = "comms"
    # The warning occurs here...

    # Rename the dept from accounting to finance for the remaining rows
    mask = df['dept'] == 'accounting'
    df.loc[mask, 'dept'] = 'finance'

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