我想在 Python 中将分类变量转换为数值
I want to convert the categorical variable to numerical in Python
我有一个包含分类变量的数据框。我想使用以下逻辑将它们转换为数字:
我有 2 个列表,一个包含列中不同的分类值,第二个列表包含每个类别的值。现在我需要映射这些值来代替那些分类值。
例如:
List_A = ['A','B','C','D','E']
List_B = [3,2,1,1,2]
我需要将 A 替换为 3,将 B 替换为 2,将 C 和 D 替换为 1,将 E 替换为 2。
在Python.
中有什么方法可以做到这一点
我可以通过应用多个 for 循环来做到这一点,但我正在寻找一些更简单的方法或一些直接函数(如果有的话)。
非常感谢任何帮助,提前致谢。
创建映射字典
List_A = ['A','B','C','D','E',]
List_B = [3,2,1,1,2]
d=dict(zip(List_A, List_B))
new_list=['A','B','C','D','E','A','B']
new_mapped_list=[d[v] for v in new_list if v in d]
new_mapped_list
或者定义一个函数并使用map
List_A = ['A','B','C','D','E',]
List_B = [3,2,1,1,2]
d=dict(zip(List_A, List_B))
def mapper(value):
if value in d:
return d[value]
return None
new_list=['A','B','C','D','E','A','B']
map(mapper,new_list)
假设 df 是您的数据框,"Category" 是包含您的类别的列的名称:
df[df.Category == "A"] = 3,2, 1, 1, 2
df[(df.Category == "B") | (df.Category == "E") ] = 2
df[(df.Category == "C") | (df.Category == "D") ] = 1
如果您只需要将一个列表中的值替换为另一个列表中的值,并且结构就像您说的那样。两个列表,相同的长度和相同的位置,那么你只需要这个:
list_a = []
list_a = list_b
一个更复杂的解决方案是这样的,它有一个函数可以创建一个你可以在其他列表上使用的字典:
# we make a function
def convert_list(ls_a,ls_b):
dic_new = {}
for letter,number in zip(ls_a,ls_b):
dic_new[letter] = number
return dic_new
这将创建一个包含您需要的组合的字典。您传递了两个列表,然后您可以在其他列表上使用该字典:
List_A = ['A','B','C','D','E']
List_B = [3,2,1,1,2]
dic_new = convert_list(ls_a, ls_b)
other_list = ['a','b','c','d']
for _ in other_list:
print(dic_new[_.upper()])
# prints
3
2
1
1
干杯
您可以使用机器学习 scikit-learn 模块中的解决方案。
OneHotEncoder
LabelEncoder
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
pandas"hard"方式:
我有一个包含分类变量的数据框。我想使用以下逻辑将它们转换为数字:
我有 2 个列表,一个包含列中不同的分类值,第二个列表包含每个类别的值。现在我需要映射这些值来代替那些分类值。
例如:
List_A = ['A','B','C','D','E']
List_B = [3,2,1,1,2]
我需要将 A 替换为 3,将 B 替换为 2,将 C 和 D 替换为 1,将 E 替换为 2。
在Python.
中有什么方法可以做到这一点我可以通过应用多个 for 循环来做到这一点,但我正在寻找一些更简单的方法或一些直接函数(如果有的话)。
非常感谢任何帮助,提前致谢。
创建映射字典
List_A = ['A','B','C','D','E',]
List_B = [3,2,1,1,2]
d=dict(zip(List_A, List_B))
new_list=['A','B','C','D','E','A','B']
new_mapped_list=[d[v] for v in new_list if v in d]
new_mapped_list
或者定义一个函数并使用map
List_A = ['A','B','C','D','E',]
List_B = [3,2,1,1,2]
d=dict(zip(List_A, List_B))
def mapper(value):
if value in d:
return d[value]
return None
new_list=['A','B','C','D','E','A','B']
map(mapper,new_list)
假设 df 是您的数据框,"Category" 是包含您的类别的列的名称:
df[df.Category == "A"] = 3,2, 1, 1, 2
df[(df.Category == "B") | (df.Category == "E") ] = 2
df[(df.Category == "C") | (df.Category == "D") ] = 1
如果您只需要将一个列表中的值替换为另一个列表中的值,并且结构就像您说的那样。两个列表,相同的长度和相同的位置,那么你只需要这个:
list_a = []
list_a = list_b
一个更复杂的解决方案是这样的,它有一个函数可以创建一个你可以在其他列表上使用的字典:
# we make a function
def convert_list(ls_a,ls_b):
dic_new = {}
for letter,number in zip(ls_a,ls_b):
dic_new[letter] = number
return dic_new
这将创建一个包含您需要的组合的字典。您传递了两个列表,然后您可以在其他列表上使用该字典:
List_A = ['A','B','C','D','E']
List_B = [3,2,1,1,2]
dic_new = convert_list(ls_a, ls_b)
other_list = ['a','b','c','d']
for _ in other_list:
print(dic_new[_.upper()])
# prints
3
2
1
1
干杯
您可以使用机器学习 scikit-learn 模块中的解决方案。
OneHotEncoder
LabelEncoder
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
pandas"hard"方式: