首页 > 解决方案 > 使用熊猫执行一种热编码时获取“SettingWithCopyWarning”

问题描述

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)})

有谁知道如何解决这个问题?或者有没有办法抑制警告?

提前致谢!!

标签: pythonpandas

解决方案


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


推荐阅读