
本教程详细阐述了如何利用Pandas库将一个DataFrame中的特定多列数据(如昵称)映射到另一个目标单列(如主名称),同时对其他相关列(如性别)进行简化处理,并最终与另一个DataFrame进行高效合并。文章通过具体示例代码,演示了数据转换、列清理及合并的全过程,旨在帮助读者掌握处理异构DataFrame合并的实用技巧。
在数据分析和处理中,我们经常会遇到需要整合来自不同来源或具有不同结构的数据集。一个常见的场景是,某个数据集包含主标识符(如姓名),而另一个数据集可能包含辅助标识符(如昵称),且我们希望将这些辅助标识符也作为主标识符的一部分进行统一管理。本教程将通过一个具体的案例,演示如何使用Pandas库实现这种复杂的数据转换与合并。
场景描述
假设我们有两个DataFrame,df1 包含基本的个人信息,而 df2 则在 df1 的基础上增加了 nick_name 列。我们的目标是将 df2 中的 nick_name 作为新的 name 条目,并对 sex 列进行简化,最终与 df1 合并,形成一个统一的DataFrame。
原始数据框示例:
立即学习“Python免费学习笔记(深入)”;
首先,我们定义两个初始DataFrame:
import pandas as pd# 第一个DataFramedata1 = { 'name': ['smith row', 'sam smith', 'susan storm'], 'age': [26, 30, 25], 'sex': ['male', 'male', 'female']}df1 = pd.DataFrame(data1)print("df1:")print(df1)# 第二个DataFramedata2 = { '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 sex0 smith row 26.0 male1 sam smith 30.0 male2 susan storm 25.0 female3 smity NaN m4 sammy NaN m5 suanny NaN f
注意:age 列对于 nick_name 转换而来的行将是缺失值。
核心操作步骤
为了实现上述目标,我们需要对 df2 进行一系列的预处理,使其结构与 df1 兼容,然后才能进行合并。
1. 转换 df2 的数据结构
这是整个过程的关键部分,涉及到将 nick_name 列的值转移到 name 列,并对 sex 列进行简化,同时移除不再需要的列。
a. 映射昵称到主名称列
我们将 df2 中的 nick_name 列的值赋值给 name 列。这意味着原始的 name 列数据将被 nick_name 覆盖,为后续的合并做准备。
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. 合并 DataFramesdf_combined = pd.concat([df1, df2_transformed], ignore_index=True)print("n--- 最终合并结果 df_combined ---")print(df_combined)
输出结果:
--- 原始 df1 --- name age sex0 smith row 26 male1 sam smith 30 male2 susan storm 25 female--- 原始 df2 --- name age sex nick_name0 smith row 26 male smity1 sam smith 30 male sammy2 susan storm 25 female suanny--- 转换后的 df2_transformed --- name sex0 smity m1 sammy m2 suanny f--- 最终合并结果 df_combined --- name age sex0 smith row 26.0 male1 sam smith 30.0 male2 susan storm 25.0 female3 smity NaN m4 sammy NaN m5 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:多列数据映射至单列并进行数据框合并的策略的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1382524.html
微信扫一扫
支付宝扫一扫