我正在处理如下所示的数据:
ID PATH GROUP
11937 MM-YT-UJ-OO GT
11938 YT-RY-LM TQ
11939 XX-XX-OT DX
我想将 PATH 列标记为 n-gram,然后将它们一次性编码到它们自己的列中,这样我最终会得到如下结果:
ID GROUP MM YT UJ OO RY LM XX OT MM-YT YT-UH ...
11937 GT 1 1 1 1 0 0 0 0 1 1
我还可以使用计数标记而不是单热标记,因此 11939 在 XX 列中将有一个 2 而不是 1,但我可以使用其中任何一个。
我可以使用 scikitlearn CountVectorizer 轻松标记该列,但随后我必须绑定(bind) ID
和 GROUP
字段。是否有执行此操作的标准方法或任何人都发现的最佳实践?
最佳答案
解决方案:
df.set_index(['ID', 'GROUP'], inplace=True)
pd.get_dummies(df.PATH.str.split('-', expand=True).stack())\
.groupby(level=[0,1]).sum().reset_index()
<小时/>
将 ID 列和 GROUP 列隔离为索引。然后将字符串转换为单元格项目
df.PATH.str.split('-', expand=True)
Out[37]:
0 1 2 3
ID GROUP
11937 GT MM YT UJ OO
11938 TQ YT RY LM None
11939 DX XX XX OT None
将它们放入单列数据中
df.PATH.str.split('-', expand=True).stack()
Out[38]:
ID GROUP
11937 GT 0 MM
1 YT
2 UJ
3 OO
11938 TQ 0 YT
1 RY
2 LM
11939 DX 0 XX
1 XX
2 OT
get_dummies
在列跨行分布时显示计数器
pd.get_dummies(df.PATH.str.split('-', expand=True).stack())
Out[39]:
LM MM OO OT RY UJ XX YT
ID GROUP
11937 GT 0 0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1
2 0 0 0 0 0 1 0 0
3 0 0 1 0 0 0 0 0
11938 TQ 0 0 0 0 0 0 0 0 1
1 0 0 0 0 1 0 0 0
2 1 0 0 0 0 0 0 0
11939 DX 0 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 1 0
2 0 0 0 1 0 0 0 0
按 ID、GROUP(索引中的级别 0 和 1)对数据进行分组,以将行汇总在一起,并且每个元组一行。最后重置索引以将 ID 和 GROUP 列恢复为常规列。
关于python - CountTokenizing 字段,变成列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985351/