Python 通过N-Gram字符对数据帧进行矢量化,并附加列名

Python 通过N-Gram字符对数据帧进行矢量化,并附加列名,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,我正在尝试将熊猫数据帧矢量化为单独的n克字符。不过有一个警告,我希望列名是字符序列的一部分。例如,假设这是原始数据: First Name, Last Name John, Smith 我使用的是长度为3的字符n-grams 我希望生成以下n-gram: "First Name_Joh", "First Name_ohn", "Last Name_Smi", "Last Name_mit", "Last Name_ith" 所以我可以为这个向量创建一个热编码。我希望列名是字符n-gr

我正在尝试将熊猫数据帧矢量化为单独的n克字符。不过有一个警告,我希望列名是字符序列的一部分。例如,假设这是原始数据:

First Name, Last Name
John, Smith
我使用的是长度为3的字符n-grams

我希望生成以下n-gram:

"First Name_Joh", 
"First Name_ohn", 
"Last Name_Smi", 
"Last Name_mit", 
"Last Name_ith"
所以我可以为这个向量创建一个热编码。我希望列名是字符n-gram序列的一部分。对于我正在进行的工作,我不想把所有的n-gram都集中在一起。(如果我没有使用正确的术语,很抱歉;我不擅长解释此材料。)


^我知道如何以一种低效的方式使用循环来实现这一点;然而,我需要这是可伸缩的和可重用的,所以我想使用像sklearn的CountVectorizer这样的东西来做到这一点。我该怎么做

不确定这是否正是您想要的,但也许您可以使用字符分析器使用
CountVectorizer
,并在列上迭代到gram

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

data = pd.DataFrame(
    {
        'first_name': ['John', 'Ed'],
        'last_name': ['Smith', 'Bean']
    }
)

vec = CountVectorizer(analyzer = 'char', ngram_range = (3, 3))

output = pd.DataFrame()

for i in data.columns:

    pre = pd.DataFrame(vec.fit_transform(data[i]).toarray(), columns = [i + '_' + j for j in vec.get_feature_names()])

    output = pd.concat([output, pre], axis = 1)

pd.concat([data, output], axis = 1)
给出:

或者您希望名称作为值

output * output.columns
给出:


在这里,循环确实是您唯一的选择。注意,
countvectorier
使用循环。您可以尝试将字符串转换为一些数字并对其进行操作。