我在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
:
subset = data[['A', 'B']].copy()
。subset = data.filter(['A','B'], axis=1)
subset = pd.Dataframe(data[['A', 'B']])
subset = data.copy()
subset.drop(columns =['C','D'])
subset = pd.DataFrame({'id': list(data.id), 'genre': list(data.genre)})
有人知道如何解决此问题吗?还是有办法取消警告?
提前谢谢!
答案 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 = ...
)。