counttoken化字段,将其转换为列



我正在处理的数据看起来像这样:

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

我也可以使用计数标记而不是1 -hot,因此11939在XX列中有一个2而不是1,但是我可以使用这两种标记。

我可以很容易地用scikitlearn CountVectorizer标记列,但然后我必须绑定IDGROUP字段。是否有一个标准的方法来做到这一点,或者有人发现了一个最佳实践?

解决方案:

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列恢复为常规列。

也许你可以试一下。

# Test data
df = DataFrame({'GROUP': ['GT', 'TQ', 'DX'],
 'ID': [11937, 11938, 11939],
 'PATH': ['MM-YT-UJ-OO', 'YT-RY-LM', 'XX-XX-OT']})
# Expanding data and creating on column by token
tmp = pd.concat([df.loc[:,['GROUP', 'ID']], 
                 df['PATH'].str.split('-', expand=True)], axis=1)
# Converting wide to long format
tmp = pd.melt(tmp, id_vars=['ID', 'GROUP'])
# Now grouping and counting
tmp.groupby(['ID', 'GROUP', 'value']).count().unstack().fillna(0)
#             variable                                   
# value             LM   MM   OO   OT   RY   UJ   XX   YT
# ID    GROUP                                            
# 11937 GT         0.0  1.0  1.0  0.0  0.0  1.0  0.0  1.0
# 11938 TQ         1.0  0.0  0.0  0.0  1.0  0.0  0.0  1.0
# 11939 DX         0.0  0.0  0.0  1.0  0.0  0.0  2.0  0.0

相关内容

  • 没有找到相关文章

最新更新