最近做实验发现预处理的时候将原始分类变量列删除了,只留下了哑变量列表,研究了一下怎么基于哑变量列表重新编写原始分类列表并将其插入数据中。
一、哑变量列表中已经包含原始分类名称
在最初进行数据预处理时候,如果最后得到的哑变量是“分类名称_分类”这种形式的,可以采用下面代码重新构建原始分类列表。
import pandas as pd
# 假设我们有一个包含哑变量的DataFrame
data = {
'Category_A': [1, 0, 1, 0, 0, 0],
'Category_B': [0, 1, 0, 0, 1, 0],
'Category_C': [0, 0, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
# 使用idxmax方法找到每行中值为1的列的索引
# 然后使用这些索引来获取对应的类别值
# 由于哑变量的列名包含了原始类别名(例如'Category_A'中的'A'),我们可以使用str.split方法来提取它
original_categories = df.idxmax(axis=1).str.split('_').str[1]
# 将原始类别值添加到DataFrame中
df['Original_Category'] = original_categories
print(df)
最后得出的结果如下:
二、哑变量列表中不包含原始分类名称
1.如果最后得到的哑变量没有类别名称这种形式的,可以采用下面代码重新构建原始分类列表。
import pandas as pd
# 假设我们有一个包含哑变量的DataFrame
data = {
'0': [1, 0, 0, 0, 0, 0],
'1': [0, 1, 0, 0, 0, 0],
'2': [0, 0, 1, 0, 0, 0],
'3': [0, 0, 0, 1, 0, 0],
'4': [0, 0, 0, 0, 1, 0],
'5': [0, 0, 0, 0, 0, 1]
}
df = pd.DataFrame(data)
# 创建一个映射字典,将哑变量的列名映射回原始的类别值
# 假设原始类别值是['A', 'B', 'C', 'D', 'E', 'F']
category_map = {str(i): category for i, category in enumerate(['A', 'B', 'C', 'D', 'E', 'F'])}
# 使用idxmax方法找到每行中值为1的列的索引
# 然后使用映射字典将索引转换回原始的类别值
original_categories = df.idxmax(axis=1).map(category_map)
# 将原始类别值添加到DataFrame中
df['Original_Category'] = original_categories
print(df)
最终输出结果如下:
2.如果最后得到的哑变量知识类别名称,构建原始分类列代码如下:
import pandas as pd
# 假设我们有一组哑变量,每个手术类型对应一个列,值为0或1
data = {
'A': [1, 0, 0, 0, 0, 0],
'B': [0, 1, 0, 0, 0, 0],
'C': [0, 0, 1, 0, 0, 0],
'D': [0, 0, 0, 1, 0, 0],
'E': [0, 0, 0, 0, 1, 0],
'F': [0, 0, 0, 0, 0, 1]
}
df = pd.DataFrame(data)
# 使用idxmax方法找到每行中值为1的列的索引
# 然后使用这些索引来获取对应的类别值
original_categories = df.idxmax(axis=1)
# 将原始类别值添加到DataFrame中
df['原始类型'] = original_categories
print(df)
结果如下:
希望可以帮助到大家!