You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多列映射为单列?实现DataFrame间动态列映射

问题:多列映射为单列及不同DataFrame间动态列映射实现

原始数据

第一个DataFrame

name        age   sex
smith row   26    male
sam smith   30    male
susan storm   25  female

第二个DataFrame

name        age   sex    nick_name
smith row   26    male   smity
sam smith   30    male   sammy
susan storm   25  female suanny

期望输出

name         age   sex
smith row   26    male
sam smith   30    male
susan storm   25  female
smity             m
sammy             m
suanny            f

实现方案

1. 基础实现步骤

用Pandas即可完成需求,核心是提取第二个DataFrame的昵称列生成新行,映射性别缩写后与第一个DataFrame合并:

import pandas as pd

# 初始化两个DataFrame
df1 = pd.DataFrame({
    'name': ['smith row', 'sam smith', 'susan storm'],
    'age': [26, 30, 25],
    'sex': ['male', 'male', 'female']
})

df2 = pd.DataFrame({
    'name': ['smith row', 'sam smith', 'susan storm'],
    'age': [26, 30, 25],
    'sex': ['male', 'male', 'female'],
    'nick_name': ['smity', 'sammy', 'suanny']
})

# 从df2生成昵称对应的行:将nick_name转为name,性别映射为缩写,age留空
nick_rows = df2[['nick_name', 'sex']].rename(columns={'nick_name': 'name'})
nick_rows['sex'] = nick_rows['sex'].map({'male': 'm', 'female': 'f'})
nick_rows['age'] = pd.NA

# 合并原始df1和生成的昵称行
result = pd.concat([df1, nick_rows], ignore_index=True)
# 确保列顺序与期望一致
result = result[['name', 'age', 'sex']]

# 打印输出
print(result.to_string(index=False))

2. 动态列映射实现

如果需要适配不同的列名或映射规则,可以通过配置字典实现动态处理,避免硬编码:

# 动态配置:列名映射、性别缩写映射
column_mapping = {'nick_name': 'name'}  # 原列名 → 目标列名
sex_abbr_mapping = {'male': 'm', 'female': 'f'}

def generate_dynamic_rows(source_df, col_map, sex_map):
    # 提取需要的列并重命名
    source_col = list(col_map.keys())[0]
    target_col = list(col_map.values())[0]
    new_rows = source_df[[source_col, 'sex']].rename(columns=col_map)
    # 应用性别映射
    new_rows['sex'] = new_rows['sex'].map(sex_map)
    # 设置age列为空
    new_rows['age'] = pd.NA
    return new_rows

# 生成动态行并合并
dynamic_nick_rows = generate_dynamic_rows(df2, column_mapping, sex_abbr_mapping)
final_result = pd.concat([df1, dynamic_nick_rows], ignore_index=True)[['name', 'age', 'sex']]

print(final_result.to_string(index=False))

这种方式下,只要修改column_mapping和sex_abbr_mapping,就能适配不同的列名或映射规则,实现跨DataFrame的动态列映射。

内容的提问来源于stack exchange,提问作者Rahat Sarawasee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:33:30