Python 2.7 在运行机器学习之前,对如何存储提取的子字符串特征感到困惑

Python 2.7 在运行机器学习之前,对如何存储提取的子字符串特征感到困惑,python-2.7,pandas,machine-learning,feature-extraction,data-manipulation,Python 2.7,Pandas,Machine Learning,Feature Extraction,Data Manipulation,我有一些关于姓名和种族的数据 j-bte letourneau scotish jane mc-earthar french amabil bonneau english 然后,通过将空格替换为“#”,并添加尾随“?”来规范名称本身,以标准化名称条目的总长度。我想用连续的三个字母的子串作为我的特征来预测种族 name_filled substr1 substr2 substr3 \ 0 j

我有一些关于姓名和种族的数据

j-bte letourneau   scotish
jane mc-earthar    french   
amabil bonneau   english   
然后,通过将空格替换为“#”,并添加尾随“?”来规范名称本身,以标准化名称条目的总长度。我想用连续的三个字母的子串作为我的特征来预测种族

                                name_filled      substr1 substr2 substr3  \
0   j-bte#letourneau???????????????????????????     j-b     -bt     bte   
1   jane#mc-earthar????????????????????????????     jan     ane     ne#   
2   amabil#bonneau?????????????????????????????     ama     mab     abi   
以下是我的数据操作代码:

import pandas as pd
from pandas import DataFrame
import re

# Get csv file into data frame
data = pd.read_csv("C:\Users\KubiK\Desktop\OddNames_sampleData.csv")
frame = DataFrame(data)
frame.columns = ["name", "ethnicity"]
name = frame.name
ethnicity = frame.ethnicity

# Remove missing ethnicity data cases
index_missEthnic = frame.ethnicity.isnull()
index_missName = frame.name.isnull()
frame2 = frame.loc[~index_missEthnic, :]
frame3 = frame2.loc[~index_missName, :]

# Make all letters into lowercase
frame3.loc[:, "name"] = frame3["name"].str.lower()
frame3.loc[:, "ethnicity"] = frame3["ethnicity"].str.lower()

# Remove all non-alphabetical characters in Name
frame3.loc[:, "name"] = frame3["name"].str.replace(r'[^a-zA-Z\s\-]', '') # Retain space and hyphen

# Replace empty space as "#"
frame3.loc[:, "name"] = frame3["name"].str.replace('[\s]', '#')

# Find the longest name in the dataset
##frame3["name_length"] = frame3["name"].str.len()
##nameLength = frame3.name_length
##print nameLength.max() # Longest name has !!!40 characters!!! including spaces and hyphens

# Add "?" to fill spaces up to 43 characters
frame3["name_filled"] = frame3["name"].str.pad(side="right", width=43, fillchar="?")

# Split into three-character strings
for i in range(1, 41):
    substr = "substr" + str(i)
    frame3[substr] = frame3["name_filled"].str[i-1:i+2]
我的问题是,以这种方式存储3个字符的子字符串来运行机器学习算法会有问题吗?这可能是一个问题,如下例所示

想象两个中国人都姓陈,但一个叫“李灿”,另一个叫“陈若瑟”


Chan将被分为“cha”和“han”,但对于第一种情况,“cha”将存储在str4中,而另一个将存储在str8中,因为名字将其推到更晚的时间存储。我想知道我是否可以也应该将3个字符的子字符串作为一个列表存储在一个单一变量中(例如:[“j-b”、“-bt”、“bte”]表示情况0的子字符串变量),如果子字符串存储在一个单一变量中,它可以用机器学习算法来预测种族吗?

将姓名拆分为名字和姓氏,然后执行3个字符的拆分难道没有意义吗?是的,我也在考虑这样做(一点也不难),但问题是我将遇到如何存储它们的同样挑战?无论是在单个变量中作为列表,还是在单独的变量中。就我个人而言,我会将其作为单独的变量存储,但您必须确定最大列数,列表是可以的,但您必须迭代列表或转换为适当的数据类型,以便对您的模型进行培训