
本教程详细介绍了如何使用pandas库将一个dataframe中的多列数据(如昵称)映射到目标dataframe的单列中,并进行其他必要的列数据转换(如性别缩写),最终与另一个dataframe进行合并。通过实际代码示例,您将学习如何灵活地重塑和整合不同结构的数据,以满足特定的分析和报告需求。
在数据处理和分析中,我们经常会遇到需要整合来自不同数据源或结构各异的DataFrame的情况。一个常见的场景是,我们希望将一个DataFrame中的特定信息(可能分散在多列中)统一映射到另一个DataFrame的某一列,同时可能还需要对其他列进行格式转换,最终将处理后的数据与现有数据合并。本文将通过一个具体的示例,详细讲解如何使用Pandas实现这一过程。
假设我们有两个DataFrame,df1 包含基本的个人信息,而 df2 除了基本信息外,还包含一个 nick_name 列。我们的目标是创建一个新的DataFrame,其中包含 df1 的所有行,以及 df2 中 nick_name 作为 name、sex 缩写后的行。
初始数据示例:
首先,我们定义两个初始DataFrame:
import pandas as pd
import numpy as np
# 第一个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)
# Output:
# name age sex
# 0 smith row 26 male
# 1 sam smith 30 male
# 2 susan storm 25 female
# 第二个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)
# Output:
# name age sex nick_name
# 0 smith row 26 male smity
# 1 sam smith 30 male sammy
# 2 susan storm 25 female suanny我们期望的输出结果是 df1 的内容,加上 df2 中 nick_name 作为 name,sex 缩写(如 'm', 'f')后的新行,而 age 列则因 nick_name 行没有对应年龄而显示为 NaN。
要达到预期的结果,我们需要对 df2 进行一系列的预处理操作,使其结构与 df1 兼容,然后才能进行合并。
这一步是核心,涉及到列的替换、转换和删除。
将 nick_name 列的值赋给 name 列: 这是将多列信息(这里是 nick_name)映射到目标单列(name)的关键一步。通过直接赋值,我们将 df2 中 nick_name 列的数据“移动”到了 name 列。
df2_processed = df2.copy() # 创建副本以避免修改原始df2 df2_processed['name'] = df2_processed['nick_name']
转换 sex 列: 根据需求,我们将 sex 列的值转换为其首字母(例如 'male' 变为 'm','female' 变为 'f')。
df2_processed['sex'] = df2_processed['sex'].str[0]
删除不需要的列: 为了使 df2_processed 的列结构与 df1 保持一致,我们需要删除 age 和 nick_name 列。age 列被删除后,在后续合并时,对应 nick_name 行的 age 值将自动填充为 NaN,这符合我们的预期。
df2_processed = df2_processed.drop(columns=['age', 'nick_name'])
将上述操作整合起来:
# 对df2进行处理,使其结构与df1兼容
df2_processed = df2.copy()
df2_processed['name'] = df2_processed['nick_name'] # 将nick_name映射到name列
df2_processed['sex'] = df2_processed['sex'].str[0] # 将sex转换为首字母
df2_processed = df2_processed.drop(columns=['age', 'nick_name']) # 删除age和nick_name列
print("\ndf2_processed (重塑后):")
print(df2_processed)
# Output:
# name sex
# 0 smity m
# 1 sammy m
# 2 suanny f可以看到,df2_processed 现在只有 name 和 sex 两列,并且数据已经按照我们的要求进行了转换。
现在 df1 和 df2_processed 具有兼容的列结构,我们可以使用 pd.concat() 函数将它们按行合并。ignore_index=True 参数将重置索引,确保合并后的DataFrame有一个连续的新索引。
# 合并df1和处理后的df2
final_df = pd.concat([df1, df2_processed], ignore_index=True)
print("\n最终合并结果:")
print(final_df)
# Output:
# 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本教程展示了如何利用Pandas的强大功能来重塑和合并DataFrames。关键在于理解如何通过列赋值、数据类型转换和列删除等操作,使不同结构的DataFrame在合并前达到兼容状态。这种方法在处理复杂的数据整合任务时非常实用,能够帮助您灵活地管理和组织数据,以满足多样化的数据分析需求。熟练掌握这些技巧,将大大提升您在数据预处理阶段的效率。
以上就是Pandas数据重塑:多列映射、数据转换与DataFrame合并实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号