如何将单物种列的DataFrame转换为多列独热编码格式?
实现DataFrame物种列的独热编码转换
针对你需要将包含ID、经纬度和物种的DataFrame转换为「每个物种作为单独列,对应行属于该物种时标记1,否则标记0」的需求,这里提供两种高效的处理方法,尤其适合40余种物种的场景:
方法一:使用pandas.get_dummies()(推荐)
get_dummies是Pandas专门用于生成独热编码的工具,能自动识别所有物种类别并生成对应列,无需手动指定,处理大量分类时效率极高。
代码示例
import pandas as pd # 构造示例数据(实际使用时替换为你的DataFrame) data = { 'ID': [1,2,3,4,5,6,7], 'lon': [8.94697, 8.94393, 8.94526, 8.94355, 8.94142, 8.94119, 8.94406], 'lat': [48.1015, 48.1007, 48.1031, 48.0977, 48.0985, 48.0980, 48.0954], 'species': ['sp1','sp1','sp2','sp2','sp1','sp3','sp4'] } df = pd.DataFrame(data) # 对species列生成独热编码,去掉前缀避免列名冗余 species_dummies = pd.get_dummies(df['species'], prefix='', prefix_sep='') # 合并原数据的ID、lon、lat列与编码后的物种列 result_df = pd.concat([df[['ID', 'lon', 'lat']], species_dummies], axis=1) print(result_df)
说明
- 该方法会自动遍历所有物种类别,生成对应列,即使新增物种也无需修改代码
prefix=''和prefix_sep=''用于让生成的列名直接为物种名称(如sp1),完全匹配你的格式需求
方法二:使用pandas.pivot_table()
通过透视表的方式也可以实现需求,适合需要自定义聚合逻辑的场景:
代码示例
import pandas as pd # 构造示例数据 data = { 'ID': [1,2,3,4,5,6,7], 'lon': [8.94697, 8.94393, 8.94526, 8.94355, 8.94142, 8.94119, 8.94406], 'lat': [48.1015, 48.1007, 48.1031, 48.0977, 48.0985, 48.0980, 48.0954], 'species': ['sp1','sp1','sp2','sp2','sp1','sp3','sp4'] } df = pd.DataFrame(data) # 生成透视表,空值填充为0 result_pivot = df.pivot_table( index=['ID', 'lon', 'lat'], columns='species', aggfunc=lambda x: 1, # 存在该物种则标记为1 fill_value=0 ).reset_index() # 调整列名结构,去掉多余层级 result_pivot.columns = result_pivot.columns.droplevel(0) result_pivot.rename(columns={'': 'ID', '': 'lon', '': 'lat'}, inplace=True) print(result_pivot)
说明
- 透视表通过分组索引(ID、lon、lat)和列(species)构建表格,聚合函数确保存在物种的行标记为1
- 需要额外调整列名结构,相比
get_dummies步骤稍多
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

