
本文详细介绍了在pandas dataframe中将多列堆叠并重塑为更简洁结构的三种高效方法。通过实例代码,分别演示了如何利用multiindex、`melt`与`pivot`组合以及`janitor`库的`pivot_longer`函数来实现数据从宽格式到长格式的转换,旨在帮助用户根据具体场景选择最合适的重塑策略,提升数据处理效率。
在数据分析和处理中,经常需要对DataFrame的结构进行调整,以适应不同的分析需求或模型输入。其中一个常见场景是将多个具有相似语义的列堆叠(stack)成少数几列,同时引入一个标识原始列来源的新列。例如,将包含左右侧(left_和right_)计数(_count)和总和(_sum)的列重塑为包含side、count和sum的更紧凑格式。
考虑以下初始DataFrame:
import pandas as pd
df = pd.DataFrame({
'date': ['2023-12-01', '2023-12-05', '2023-12-07'],
'other_col': ['a', 'b', 'c'],
'right_count': [4, 7, 9],
'right_sum': [2, 3, 5],
'left_count': [1, 8, 5],
'left_sum': [0, 8, 4]
})
print("原始DataFrame:")
print(df)期望的输出格式如下:
date other_col side count sum 0 2023-12-01 a right 4 2 1 2023-12-05 b right 7 3 2 2023-12-07 c right 9 5 3 2023-12-01 a left 1 0 4 2023-12-05 b left 8 8 5 2023-12-07 c left 5 4
下面将介绍三种实现此重塑目标的方法。
这种方法通过巧妙地构建一个临时的MultiIndex(多级索引)来组织列,然后使用stack操作将数据从宽格式转换为长格式。
out_multiindex = (df
.set_index(['date', 'other_col']) # 1. 设置索引
.pipe(lambda x: x.set_axis(x.columns.str.split('_', expand=True), axis=1)) # 2. 创建MultiIndex列
.rename_axis(columns=['side', None]) # 3. 重命名列轴
.stack('side') # 4. 堆叠'side'层
.reset_index() # 5. 重置索引
)
print("\n方法一:使用MultiIndex和stack")
print(out_multiindex)注意事项: 这种方法非常灵活,适用于列名具有清晰分隔符,并且需要将特定层级的列名转换为新列的场景。它要求对Pandas的MultiIndex操作有一定理解。
melt和pivot是Pandas中进行数据重塑的两个核心函数,它们组合起来可以实现复杂的宽长格式转换。
tmp = df.melt(['date', 'other_col'], var_name='temp_col') # 1. melt操作
# 2. 拆分列名
tmp[['side', 'col_type']] = tmp['temp_col'].str.split('_', n=1, expand=True)
out_melt_pivot = (tmp.pivot(index=['date', 'other_col', 'side'],
columns='col_type', values='value') # 3. pivot操作
.reset_index() # 4. 重置索引
.rename_axis(columns=None) # 清理列名
)
print("\n方法二:结合melt和pivot")
print(out_melt_pivot)注意事项: melt和pivot是Pandas中非常常用的重塑工具,理解它们的工作原理对于处理各种数据格式至关重要。这种方法通常更易于理解和调试,因为它将重塑过程分解为几个逻辑步骤。
对于更复杂的重塑任务,或者当需要更简洁的语法时,可以考虑使用第三方库pyjanitor。它提供了类似R语言tidyr包的pivot_longer功能,能够以更声明式的方式处理宽长格式转换。
pip install pyjanitor
# pip install pyjanitor
import janitor
out_janitor = df.pivot_longer(index=['date', 'other_col'],
names_to=('side', '.value'),
names_pattern=r'([^_]+)_([^_]+)')
print("\n方法三:使用janitor库的pivot_longer")
print(out_janitor)注意事项: janitor库的pivot_longer函数提供了强大的正则表达式匹配能力,使得处理具有复杂命名模式的列变得非常简单。.value占位符指示匹配到的部分应该直接作为新的列名,而不是作为新列的值。虽然引入了外部依赖,但对于频繁进行复杂重塑的用户来说,它可以显著提高代码的可读性和开发效率。
本文介绍了在Pandas DataFrame中将多列堆叠并重塑为更简洁结构的三种主要方法:
选择哪种方法取决于具体的数据结构、个人偏好以及对库的熟悉程度。在实际应用中,建议根据数据的复杂性和团队的习惯,选择最适合的工具来高效完成数据重塑任务。
以上就是Pandas数据重塑教程:高效堆叠多列的多种方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号