
本教程探讨如何将水平宽度过大的pandas dataframe重塑为更易读的垂直长格式。针对列数能被目标组数整除和不能整除的两种情况,文章详细介绍了使用numpy `reshape`方法进行高效转换,以及利用pandas `multiindex`结合`stack`操作处理复杂场景的专业技巧,旨在帮助用户优化数据结构,提升数据分析效率。
在数据处理和分析中,我们经常会遇到数据以“宽”格式存储的情况,即一个实体的信息横向铺开,占据了大量的列。例如,一个CSV文件可能有数百甚至数千列,这使得数据难以直观阅读和分析。为了更好地进行数据操作和可视化,通常需要将这种宽格式数据转换为“长”格式,使其更符合关系型数据库或某些数据分析工具的要求。本文将详细介绍两种在Pandas中实现这种数据重塑的专业方法:利用NumPy的reshape功能以及结合Pandas MultiIndex和stack操作。
当原始DataFrame的列数能够被目标组的列数整除时,NumPy的reshape方法提供了一种非常高效且简洁的解决方案。这种方法直接作用于底层NumPy数组,避免了Pandas层面的一些开销。
以下是一个具体的示例:
import pandas as pd
import numpy as np
# 假设我们有一个宽格式的DataFrame
# 模拟一个3行12列的DataFrame,列数12可以被6整除
np.random.seed(123)
df = pd.DataFrame(np.random.randint(10, size=(3, 12)))
print("原始DataFrame:")
print(df)
# 原始DataFrame:
# 0 1 2 3 4 5 6 7 8 9 10 11
# 0 2 2 6 1 3 9 6 1 0 1 9 0
# 1 0 9 3 4 0 0 4 1 7 3 2 4
# 2 7 2 4 8 0 7 9 3 4 6 1 5
# 目标列名
target_columns = ['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']
group_size = len(target_columns) # 每组6列
# 检查列数是否可被整除
print(f"\n原始DataFrame列数: {len(df.columns)}")
print(f"列数 % {group_size} = {len(df.columns) % group_size}")
if len(df.columns) % group_size == 0:
# 使用NumPy的reshape方法
df_target = pd.DataFrame(df.to_numpy().reshape(-1, group_size),
columns=target_columns)
print("\n重塑后的DataFrame:")
print(df_target)
else:
print("\n列数不能被目标组大小整除,请考虑使用Pandas MultiIndex和stack方法。")
# 重塑后的DataFrame:
# GroupA GroupB GroupC GroupD GroupE GroupF
# 0 2 2 6 1 3 9
# 1 6 1 0 1 9 0
# 2 0 9 3 4 0 0
# 3 4 1 7 3 2 4
# 4 7 2 4 8 0 7
# 5 9 3 4 6 1 5当原始DataFrame的列数不能被目标组的列数整除时,或者需要更灵活地处理列分组时,结合使用Pandas的MultiIndex和stack操作是一个强大的解决方案。这种方法能够优雅地处理不规则的列分组,并在必要时引入NaN值。
立即学习“Python免费学习笔记(深入)”;
以下是一个具体的示例:
import pandas as pd
import numpy as np
# 模拟一个3行10列的DataFrame,列数10不能被6整除
np.random.seed(123)
df = pd.DataFrame(np.random.randint(10, size=(3, 10)))
print("原始DataFrame:")
print(df)
# 原始DataFrame:
# 0 1 2 3 4 5 6 7 8 9
# 0 2 2 6 1 3 9 6 1 0 1
# 1 9 0 0 9 3 4 0 0 4 1
# 2 7 3 2 4 7 2 4 8 0 7
# 目标列名
target_columns = ['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']
group_size = len(target_columns) # 每组6列
print(f"\n原始DataFrame列数: {len(df.columns)}")
print(f"列数 % {group_size} = {len(df.columns) % group_size}") # 结果为2,不能整除
# 创建用于MultiIndex的索引数组
# a % group_size: [0, 1, 2, 3, 4, 5, 0, 1, 2, 3] (表示在组内的位置)
# a // group_size: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1] (表示组的序号)
a = np.arange(len(df.columns))
# 设置MultiIndex,然后stack
df_target_multiindex = (df.set_axis([a % group_size, a // group_size], axis=1)
.stack() # 堆叠最内层索引 (即a % group_size)
.set_axis(target_columns, axis=1) # 重命名列
.reset_index(drop=True)) # 重置索引
print("\n重塑后的DataFrame (使用MultiIndex和stack):")
print(df_target_multiindex)
# 重塑后的DataFrame (使用MultiIndex和stack):
# GroupA GroupB GroupC GroupD GroupE GroupF
# 0 2 2 6 1 3.0 9.0
# 1 6 1 0 1 NaN NaN
# 2 9 0 0 9 3.0 4.0
# 3 0 0 4 1 NaN NaN
# 4 7 3 2 4 7.0 2.0
# 5 4 8 0 7 NaN NaN将宽格式的DataFrame重塑为长格式是数据预处理中的常见任务。本文介绍了两种核心策略:当列数完美匹配时,利用NumPy的reshape方法可以实现高效的转换;而当列数不规则时,结合Pandas的MultiIndex和stack操作则提供了更灵活和鲁棒的解决方案。掌握这些技巧将极大地提升你在处理复杂数据结构时的效率和能力,使你的数据分析工作更加顺畅。在实际应用中,根据数据的特性和具体需求选择最适合的方法至关重要。
以上就是Python Pandas:重塑宽格式DataFrame为长格式的策略与实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号