新闻中心

Python Pandas:多列数据映射至单列并进行数据框合并的策略

2025-11-23
浏览次数:
返回列表

python pandas:多列数据映射至单列并进行数据框合并的策略

本教程详细阐述了如何利用Pandas库将一个DataFrame中的特定多列数据(如昵称)映射到另一个目标单列(如主名称),同时对其他相关列(如性别)进行简化处理,并最终与另一个DataFrame进行高效合并。文章通过具体示例代码,演示了数据转换、列清理及合并的全过程,旨在帮助读者掌握处理异构DataFrame合并的实用技巧。

在数据分析和处理中,我们经常会遇到需要整合来自不同来源或具有不同结构的数据集。一个常见的场景是,某个数据集包含主标识符(如姓名),而另一个数据集可能包含辅助标识符(如昵称),且我们希望将这些辅助标识符也作为主标识符的一部分进行统一管理。本教程将通过一个具体的案例,演示如何使用Pandas库实现这种复杂的数据转换与合并。

场景描述

假设我们有两个DataFrame,df1 包含基本的个人信息,而 df2 则在 df1 的基础上增加了 nick_name 列。我们的目标是将 df2 中的 nick_name 作为新的 name 条目,并对 sex 列进行简化,最终与 df1 合并,形成一个统一的DataFrame。

原始数据框示例:

首先,我们定义两个初始DataFrame:

import pandas as pd

# 第一个DataFrame
data1 = {
    'name': ['smith row', 'sam smith', 'susan storm'],
    'age': [26, 30, 25],
    'sex': ['male', 'male', 'female']
}
df1 = pd.DataFrame(data1)
print("df1:")
print(df1)

# 第二个DataFrame
data2 = {
    'name': ['smith row', 'sam smith', 'susan storm'],
    'age': [26, 30, 25],
    'sex': ['male', 'male', 'female'],
    'nick_name': ['smity', 'sammy', 'suanny']
}
df2 = pd.DataFrame(data2)
print("\ndf2:")
print(df2)

预期的输出结构:

我们希望最终的DataFrame包含 df1 的所有行,以及 df2 中 nick_name 转换为 name、sex 简化的新行。

        name   age     sex
0  smith row  26.0    male
1  sam smith  30.0    male
2  susan storm  25.0  female
3      smity   NaN       m
4      sammy   NaN       m
5     suanny   NaN       f

注意:age 列对于 nick_name 转换而来的行将是缺失值。

核心操作步骤

为了实现上述目标,我们需要对 df2 进行一系列的预处理,使其结构与 df1 兼容,然后才能进行合并。

1. 转换 df2 的数据结构

这是整个过程的关键部分,涉及到将 nick_name 列的值转移到 name 列,并对 sex 列进行简化,同时移除不再需要的列。

a. 映射昵称到主名称列

我们将 df2 中的 nick_name 列的值赋值给 name 列。这意味着原始的 name 列数据将被 nick_name 覆盖,为后续的合并做准备。

PictoGraphic PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic
df2['name'] = df2['nick_name']

b. 简化性别信息

将 sex 列的值简化为首字母。例如,'male' 变为 'm','female' 变为 'f'。这通过Pandas的字符串访问器 .str[0] 实现。

df2['sex'] = df2['sex'].str[0]

c. 移除冗余列

在将 nick_name 映射到 name 之后,age 和 nick_name 列对于我们想要合并的新行来说是冗余的。因此,我们需要将它们从 df2 中删除。

df2 = df2.drop(columns=['age', 'nick_name'])

经过这些转换,df2 现在只包含 name 和 sex 列,且 name 列已更新为昵称,sex 列已简化。

2. 合并 DataFrames

在 df2 经过上述转换后,它的列结构(name, sex)与 df1 的目标结构(name, age, sex)在可合并的维度上是兼容的。我们可以使用 pd.concat() 函数将 df1 和转换后的 df2 垂直堆叠起来。

为了确保合并后的索引是连续的,我们使用 ignore_index=True 参数。

df_combined = pd.concat([df1, df2], ignore_index=True)

完整示例代码

将以上所有步骤整合到一起,形成一个完整的代码示例:

import pandas as pd

# 1. 准备原始数据
data1 = {
    'name': ['smith row', 'sam smith', 'susan storm'],
    'age': [26, 30, 25],
    'sex': ['male', 'male', 'female']
}
df1 = pd.DataFrame(data1)

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

print("--- 原始 df1 ---")
print(df1)
print("\n--- 原始 df2 ---")
print(df2)

# 2. 转换 df2
# 2.1 映射 'nick_name' 到 'name'
df2['name'] = df2['nick_name']

# 2.2 简化 'sex' 列
df2['sex'] = df2['sex'].str[0]

# 2.3 移除冗余列
# 注意:这里为了清晰展示,使用了新的变量名 df2_transformed,
# 但在实际操作中可以直接修改 df2。
df2_transformed = df2.drop(columns=['age', 'nick_name']) 

print("\n--- 转换后的 df2_transformed ---")
print(df2_transformed)

# 3. 合并 DataFrames
df_combined = pd.concat([df1, df2_transformed], ignore_index=True)

print("\n--- 最终合并结果 df_combined ---")
print(df_combined)

输出结果:

--- 原始 df1 ---
          name  age     sex
0    smith row   26    male
1    sam smith   30    male
2  susan storm   25  female

--- 原始 df2 ---
          name  age     sex nick_name
0    smith row   26    male     smity
1    sam smith   30    male     sammy
2  susan storm   25  female    suanny

--- 转换后的 df2_transformed ---
     name sex
0   smity   m
1   sammy   m
2  suanny   f

--- 最终合并结果 df_combined ---
          name   age     sex
0    smith row  26.0    male
1    sam smith  30.0    male
2  susan storm  25.0  female
3        smity   NaN       m
4        sammy   NaN       m
5       suanny   NaN       f

注意事项

  • 缺失值 (NaN) 的产生:在合并 df1 和转换后的 df2 时,由于 df2_transformed 不包含 age 列,Pandas 会自动在合并后的 df_combined 中为这些新行填充 NaN 值。这通常是预期行为,但根据具体需求,你可能需要进一步处理这些缺失值(例如,填充默认值或删除)。
  • 列名对齐:pd.concat 在垂直合并时会根据列名进行对齐。如果一个DataFrame中存在另一个DataFrame中没有的列,那么在没有该列的DataFrame对应的行中,该列的值将为 NaN。
  • ignore_index=True:此参数非常重要,它会重置合并后DataFrame的索引,使其从0开始连续编号,避免了原始DataFrame索引冲突的问题。
  • 灵活性:本教程展示了一种特定的映射和转换场景。对于更复杂的动态映射或条件转换,可能需要结合 apply()、map() 或更复杂的条件逻辑。

总结

本教程提供了一种在Pandas中处理异构DataFrame合并的有效策略。通过对源DataFrame进行有针对性的列映射、数据简化和冗余列移除,我们成功地将其结构调整为与目标DataFrame兼容,并最终实现数据的无缝合并。这种方法在数据清洗、数据整合以及构建统一数据视图的场景中非常实用。掌握这些技巧将有助于你更高效地处理和分析复杂的数据集。

以上就是Python Pandas:多列数据映射至单列并进行数据框合并的策略的详细内容,更多请关注其它相关文章!


# app  # 这是  # 源代码  # 如何将  # 命令行  # 并对  # 转换为  # 数据结构  # 移除  # 数据清洗  # python  # 使其  # 无锡seo哪家能合作  # 四川网站页面优化  # 武昌网站seo优化公司哪家靠谱  # 莆田网站建设基本流程  # 织金seo网站优化  # seo行业基金运营方案  # 营销推广建议都有哪些呢  # 营销短视频推广  # 枣庄网络营销推广方式  # 马鞍山如何做网站推广  # 原始数据 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: excel如何生成目录 excel一键生成工作表目录超链接  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  蛙漫官方正版入口 蛙漫网页在线全集免费观看  多闪网页版在线观看免费入口_多闪官网访问入口  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  抖音网页版快捷访问 抖音网页版网页版入口操作教程  R星幕后开发视频泄露 包含《GTA6》等多款大作  在python-socketio事件处理器中安全访问Flask应用上下文  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  动漫花园资源网使用步骤_动漫花园资源网下载流程  PHP 枚举:根据字符串获取枚举案例的策略与实现  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  微信网页版扫码登录入口 微信网页版二维码登录入口  Go Martini框架:动态服务解码后的图片内容  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  J*a递归快速排序中静态变量的状态管理与陷阱  J*aScript数据结构转换:将对象数组按类别分组  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  照顾宝贝2小游戏点击立即在线玩  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  qq游戏网页版直接玩_qq游戏免下载快速入口  如何使 Jest 模拟函数默认抛出错误以提高测试效率  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  抖音网页版怎么|直播|_抖音网页版开播操作指南  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  在Go Martini框架中高效服务动态生成图像的实践指南  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  深入理解J*aScript中的B样条曲线与节点向量生成  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  j*a toString()的覆盖  Django通过AJAX异步上传图片并保存至模型的完整指南  如何使用纯J*aScript判断Input元素是否在特定类容器内  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  J*aScript设计模式实践_j*ascript代码优化  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  Pygame教程:解决用户输入与游戏状态更新不同步问题  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性 

搜索