Получение «SettingWithCopyWarning» при выполнении одного горячего кодирования с пандами - PullRequest
0 голосов
/ 16 декабря 2018

Я столкнулся с SettingWithCopyWarning в Python.Я искал в Интернете, но кажется, что все решения не работают для меня.

Входные данные таковы:

       id          genre
0       1        Drama, Romance
1       2        Action, Drama
2       3        Action, Comedy
3       4        Thriller

Ожидаемый результат должен быть:

       id        Drama    Romance    Action    Comedy    Thriller
0       1          1         1         0         0         0
1       2          1         0         1         0         0
2       3          0         0         1         1         0
3       4          0         0         0         0         1

Я хочу получить подмножество входных данных, добавить несколько столбцов, изменить добавленный столбец и вернуть подмножество.По сути, я НЕ хочу изменить исходный data, я просто хочу получить подмножество, которое должно быть новым фреймом данных:

# the function to deal with the genre
def genre(data):
    subset = data[['id', 'genre']]
    for i, row in subset.iterrows():
        if isinstance(row['genre'], float):
            continue
        genreList = row['genre'].split(', ')
        for genre in genreList:
            if genre in list(subset):
                subset.loc[i][genre] = 1
            else:
                subset.loc[:][genre] = 0
                subset.loc[i][genre] = 1
    return subset

Я пробовал много способов,но ни один из них не избавляется от SettingWithCopyWarning:

  1. subset = data[['A', 'B']].copy().
  2. subset = data.filter(['A','B'], axis=1)
  3. subset = pd.Dataframe(data[['A', 'B']])
  4. subset = data.copy()
    subset.drop(columns =['C','D'])
  5. subset = pd.DataFrame({'id': list(data.id), 'genre': list(data.genre)})

У кого-нибудь есть идеи, как это исправить?Или есть способ прекратить предупреждение?

Заранее спасибо !!

1 Ответ

0 голосов
/ 16 декабря 2018

Итерация не нужна и не является поднабором.Вы можете использовать str.get_dummies.

df.drop('genre', 1).join(df['genre'].str.get_dummies(sep=', '))

   id  Action  Comedy  Drama  Romance  Thriller
0   1       0       0      1        1         0
1   2       1       0      1        0         0
2   3       1       1      0        0         0
3   4       0       0      0        0         1

В результате получается новый DataFrame, вы можете назначить его другому (df2 = ...).

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