如何将多列映射为单列?实现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
相关产品推荐
相关产品推荐

