python - 根据 Python 中的唯一键将列中的类别转换为编码为 1 或 0 的多列
问题描述
我有这样的数据:
user reg ind prod
A Asia Tele TV
A Asia Bank Phone
A Japan Tele Book
B US Fin Paper
B US Data Shop
B Asia Tele TV
B Africa Invest Book
C Asia Tele Paper
C Japan Fin TV
我想将每列中的类别转换为单独的列,如果它们在用户下方,则将它们标记为 1/0,如下所示:
User Asia Japan US Africa Tele Bank Fin Data Invest TV Phone Book Paper Shop
A 1 1 0 0 1 1 0 0 0 1 1 1 0 0
B 1 0 1 1 1 0 1 1 1 1 0 1 1 1
C 1 1 0 0 1 0 1 0 0 1 0 0 1 0
基本上对它们进行编码以标记它们与每个类别的关联。此外,如果我可以重命名列,使其具有主列,例如“reg_Asia”等。我尝试使用 Pivot、Pivot_table、Stack、Unstack 但无法做到。
解决方案
如果只需要输出或需要计数值,请使用get_dummies
和:set_index
max
0/1
sum
df = pd.get_dummies(df.set_index('user'), prefix='', prefix_sep='').max(level=0).reset_index()
print (df)
user Africa Asia Japan US Bank Data Fin Invest Tele Book Paper \
0 A 0 1 1 0 1 0 0 0 1 1 0
1 B 1 1 0 1 0 1 1 1 1 1 1
2 C 0 1 1 0 0 0 1 0 1 0 1
Phone Shop TV
0 1 0 1
1 0 1 1
2 0 0 1
如果还想对数据进行分类,可以创建MultiIndex
:
df1= pd.get_dummies(df.set_index('user')).max(level=0)
df1.columns = df1.columns.str.split('_', expand=True)
print (df1)
reg ind prod
Africa Asia Japan US Bank Data Fin Invest Tele Book Paper Phone Shop TV
user
A 0 1 1 0 1 0 0 0 1 1 0 1 0 1
B 1 1 0 1 0 1 1 1 1 1 1 0 1 1
C 0 1 1 0 0 0 1 0 1 0 1 0 0 1
print (df1['reg'])
Africa Asia Japan US
user
A 0 1 1 0
B 1 1 0 1
C 0 1 1 0
推荐阅读
- android - 当下载是在 ThreadpoolExecutor 中执行的可运行文件时,如何使用下载进度更新 UI?
- conda - 自动激活鱼中的 conda 环境
- php - 如果是商店拼贴展示如何显示代码
- java - 使用线程的多个窗口(AWT),但只有最后一个窗口有效
- php - 如何在 PHP 中使用类名从扩展类调用方法
- prometheus - 普罗米修斯没有启动
- python - 安装 psycopg2 完全失败。巨大的错误信息(例如错误:command 'gcc' failed with exit status 1)
- android - SQLiteException ::没有这样的表:在android Pie 9.0中
- javascript - 反应:静态方法总是返回未定义
- python - 对每个递归步骤使用多处理