Python 获得;设置为“复制警告”;在使用熊猫执行一次热编码时

Python 获得;设置为“复制警告”;在使用熊猫执行一次热编码时,python,pandas,Python,Pandas,我在Python中遇到了设置为CopyWarning的。我在网上搜索过,但似乎所有的解决方案都不适合我 输入数据如下所示: id genre 0 1 Drama, Romance 1 2 Action, Drama 2 3 Action, Comedy 3 4 Thriller 预期结果应该是: id Drama Romanc

我在Python中遇到了设置为CopyWarning的
。我在网上搜索过,但似乎所有的解决方案都不适合我

输入数据如下所示:

       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
我想获取输入数据的子集,添加一些列,修改添加的列,然后返回子集。基本上,我不想修改原始的
数据
,我只想得到一个子集,它应该是一个全新的数据帧:

# 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
我尝试了很多方法,但都没有摆脱copywarning的
设置:

  • subset=data[['A','B']].copy()
  • subset=data.filter(['A','B',axis=1)
  • subset=pd.Dataframe(数据['A','B']])
  • subset=data.copy()
  • subset=pd.DataFrame({'id':list(data.id),'genre':list(data.genre)})
  • 有人知道如何解决这个问题吗?或者有没有办法超越警告


    提前谢谢

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

    结果是一个新的数据帧,您可以将其分配给其他对象(
    df2=…
    )。

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

    结果是一个新的数据帧,您可以将其分配给其他对象(
    df2=…
    )。

    该方法非常方便。@jlandcy我的测试表明str.get\u假人可以比pd.get\u假人更快,因为前者是为编码字符串而优化的。该方法非常方便。@jlandcy我的测试表明str.get_假人可以比pd.get_假人更快,因为前者是为编码字符串而优化的。