如何按自定义规则批量编码DataFrame中的因子水平为数字
批量将DataFrame双因子水平编码为数字
问题描述
现有Pandas DataFrame,每列仅包含两个来自{"AA", "GG", "CC", "TT"}的因子水平,需按以下规则批量将因子编码为2或0:
- 若列是
AA/CC组合:AA→2,CC→0 - 若列是
CC/TT组合:CC→2,TT→0 - 其他组合遵循优先级高的因子编码为2,低的为0的规则(优先级顺序:
AA > CC > GG > TT)
原数据示例:
| x1x | x2x | x3x | x4x | x5x | x6x | |
|---|---|---|---|---|---|---|
| 1 | TT | GG | AA | GG | AA | GG |
| 2 | CC | AA | CC | GG | TT | CC |
| 3 | CC | GG | CC | GG | AA | GG |
| 4 | TT | AA | CC | GG | TT | CC |
| 5 | CC | AA | CC | TT | AA | GG |
| 6 | TT | GG | AA | TT | AA | CC |
期望输出:
| x1x | x2x | x3x | x4x | x5x | x6x | |
|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 2 | 2 | 2 | 0 |
| 2 | 2 | 2 | 0 | 2 | 0 | 2 |
| 3 | 2 | 0 | 0 | 2 | 2 | 0 |
| 4 | 0 | 2 | 0 | 2 | 0 | 2 |
| 5 | 2 | 2 | 0 | 0 | 2 | 0 |
| 6 | 0 | 0 | 2 | 0 | 2 | 2 |
解决方案
利用Pandas的批量列操作实现高效处理,无需逐列手动编码:
步骤1:导入依赖并构造示例数据
import pandas as pd # 构造示例DataFrame(实际使用时替换为你的数据) data = { 'x1x': ['TT', 'CC', 'CC', 'TT', 'CC', 'TT'], 'x2x': ['GG', 'AA', 'GG', 'AA', 'AA', 'GG'], 'x3x': ['AA', 'CC', 'CC', 'CC', 'CC', 'AA'], 'x4x': ['GG', 'GG', 'GG', 'GG', 'TT', 'TT'], 'x5x': ['AA', 'TT', 'AA', 'TT', 'AA', 'AA'], 'x6x': ['GG', 'CC', 'GG', 'CC', 'GG', 'CC'] } df = pd.DataFrame(data)
步骤2:定义编码逻辑并批量处理
# 定义因子优先级:优先级越高,编码越可能为2 priority_map = {'AA': 3, 'CC': 2, 'GG': 1, 'TT': 0} def encode_single_column(col): # 获取当前列的两个唯一因子 unique_values = col.unique() # 对比两个因子的优先级 val1_priority = priority_map[unique_values[0]] val2_priority = priority_map[unique_values[1]] # 生成映射规则:优先级高的对应2,低的对应0 if val1_priority > val2_priority: code_map = {unique_values[0]: 2, unique_values[1]: 0} else: code_map = {unique_values[1]: 2, unique_values[0]: 0} return col.map(code_map) # 对所有列应用编码函数,生成结果DataFrame encoded_df = df.apply(encode_single_column) # 查看结果 print(encoded_df)
说明
- 该方法通过
apply批量处理所有列,避免手动循环,处理大数据量时效率更高 - 优先级映射可灵活调整,若后续规则变化,仅需修改
priority_map即可 - 自动适配每列的因子组合,无需提前指定列的组合类型
内容的提问来源于stack exchange,提问作者Sandae
相关产品推荐
相关产品推荐

