使用Pandas高效进行DataFrame多列映射与合并

使用pandas高效进行dataframe多列映射与合并

本文详细介绍了如何使用Pandas库将多个DataFrame的列数据进行转换、映射和合并,以实现复杂的数据重构需求。教程涵盖了列赋值、字符串操作、列删除以及DataFrame垂直拼接等核心操作,旨在帮助读者高效地整合不同结构的数据,并处理合并过程中可能出现的缺失值。

在数据分析和处理过程中,我们经常会遇到需要从不同来源或不同结构的DataFrame中提取、转换并合并数据的情况。例如,一个DataFrame可能包含主信息,而另一个DataFrame则包含补充信息,我们需要将这些补充信息映射到主信息的特定列,并最终整合到一起。本教程将通过一个具体的示例,详细讲解如何利用Pandas库实现这种多列映射与DataFrame合并的操作。

1. 准备初始数据

首先,我们创建两个示例DataFrame,分别命名为 df1 和 df2,它们代表了我们即将操作的原始数据。

import pandas as pdimport numpy as np# 第一个DataFramedata1 = {    'name': ['smith row', 'sam smith', 'susan storm'],    'age': [26, 30, 25],    'sex': ['male', 'male', 'female']}df1 = pd.DataFrame(data1)print("df1 (原始数据):")print(df1)print("-" * 30)# 第二个DataFrame,包含额外的'nick_name'列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("df2 (包含昵称的补充数据):")print(df2)print("-" * 30)

输出示例:

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 中的 nick_name 列作为新的 name 信息,同时将 sex 列简化为首字母,并最终与 df1 合并,形成一个统一的DataFrame。

2. 对第二个DataFrame进行数据转换与列映射

为了达到预期的合并效果,我们需要对 df2 进行一系列的转换操作。这些操作包括:

将 nick_name 列的值赋给 name 列。将 sex 列的值转换为其首字母。删除不再需要的 age 和 nick_name 列。

# 步骤1: 将'nick_name'列的值赋给'name'列df2_transformed = df2.copy() # 创建副本以避免修改原始df2df2_transformed['name'] = df2_transformed['nick_name']# 步骤2: 将'sex'列的值转换为其首字母# 使用.str[0]可以方便地提取字符串的第一个字符df2_transformed['sex'] = df2_transformed['sex'].str[0]# 步骤3: 删除不再需要的'age'和'nick_name'列df2_transformed = df2_transformed.drop(columns=['age', 'nick_name'])print("df2_transformed (转换后的数据):")print(df2_transformed)print("-" * 30)

输出示例:

df2_transformed (转换后的数据):     name sex0   smity   m1   sammy   m2  suanny   f------------------------------

经过这些转换,df2_transformed 现在只包含 name 和 sex 列,并且数据格式符合我们合并的要求。

3. 合并DataFrame

现在,我们可以使用 pd.concat() 函数将 df1 和转换后的 df2_transformed 进行垂直合并。

# 使用pd.concat()进行垂直合并# ignore_index=True 会重置合并后的索引,使其从0开始连续编号final_df = pd.concat([df1, df2_transformed], ignore_index=True)print("final_df (最终合并结果):")print(final_df)

输出示例:

final_df (最终合并结果):          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

4. 结果分析与注意事项

观察最终合并结果 final_df,我们可以看到:

df1 的所有行都被完整保留。df2_transformed 的行被追加到了 df1 的下方。由于 df2_transformed 在合并前已经移除了 age 列,因此在合并后的 final_df 中,对应 df2_transformed 来源的行在 age 列显示为 NaN(Not a Number),表示缺失值。这是 pd.concat() 处理列不匹配时的默认行为。sex 列的数据类型在合并后可能会因为 male/female 和 m/f 的混合而变为 object 类型,这是符合预期的。

注意事项与最佳实践:

列名一致性: 在进行 pd.concat() 垂直合并时,如果两个DataFrame的列名不完全一致,Pandas会默认进行外连接(union),即保留所有唯一的列名,并在缺失的列位置填充 NaN。因此,在合并前确保目标列名一致是关键。数据类型: 合并操作可能会导致列的数据类型发生变化,尤其是在存在 NaN 的情况下,整数列可能会被转换为浮点数类型。在合并后,如果需要,可能需要进行数据类型转换(例如,使用 df[‘age’].fillna(0).astype(int) 来填充 NaN 并转换为整数)。缺失值处理: 合并后产生的 NaN 值通常需要进一步处理,例如使用 fillna() 填充默认值,或使用 dropna() 删除含有 NaN 的行。具体处理方法取决于业务需求。ignore_index=True: 这个参数在垂直合并时非常有用,它会生成一个新的、连续的索引,避免了原始DataFrame索引重复或混乱的问题。动态映射: 虽然本示例是硬编码的列操作,但在实际应用中,如果需要处理大量或结构相似的DataFrame,可以考虑编写函数或使用循环来动态执行列的映射、转换和删除操作,从而提高代码的复用性和灵活性。

总结

本教程详细演示了如何利用Pandas库对DataFrame进行多步操作,包括列的赋值、字符串处理、列的删除以及最终的DataFrame垂直合并。通过这些技术,我们可以有效地重构和整合不同来源的数据,以满足复杂的数据分析需求。理解这些核心操作及其对数据结构和数据类型的影响,是进行高效数据清洗和预处理的关键。

以上就是使用Pandas高效进行DataFrame多列映射与合并的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1382492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 23:58:13
下一篇 2025年12月14日 23:58:30

相关推荐

发表回复

登录后才能评论
关注微信