在对熊猫执行一次热编码时获取“ SettingWithCopyWarning”

时间:2018-12-16 06:37:32

标签: python pandas

我在Python中遇到了SettingWithCopyWarning。我在网上搜索,但似乎所有解决方案都不适合我。

输入数据如下:

       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 :(得分:2)

不需要迭代,子集也不需要。您可以使用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 = ...)。