python - 使用熊猫执行一种热编码时获取“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
:
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)})
有谁知道如何解决这个问题?或者有没有办法抑制警告?
提前致谢!!
解决方案
不需要迭代,也不需要子集。您可以使用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 = ...
)。
推荐阅读
- python - Python,从具有相应值的许多 csv 文件中计算平均值/平均值
- javascript - 为什么 html5 视频与 CORS 政策没有问题?
- python - 使用写时复制(COW)在 Python 中复制文件
- sql - 使用 SQLite 触发器增加值的问题
- html - 仅使用两个单词时,CSS连字符在 chrome 中无法正常工作
- vue.js - Vuejs 隐藏/显示元素在路由更改时刷新
- autodesk-forge - 在 Forge Web 应用程序中,尝试从新的 Revit 2021 单元中获取单元的旧简称
- javascript - 从 js 中删除 css 模块对象
- python - 使用 Matplotlib 在顶部较浅的 cmap 颜色上绘制较暗的 cmap 颜色
- zerobrane - ZeroBrane:更改自动完成菜单的颜色...?