
本文将深入探讨在pandas dataframe中将多对相关列(如`right_count`, `right_sum`, `left_count`, `left_sum`)高效重塑为更紧凑长格式(如`side`, `count`, `sum`)的多种方法。我们将介绍基于multiindex和`stack`的自定义重塑、结合`melt`和`pivot`的经典方案,以及利用`janitor`库中`pivot_longer`函数的简洁实现,旨在提供清晰、专业的教程,帮助读者根据具体场景选择最合适的重塑策略。
在数据分析和处理中,我们经常需要将宽格式(wide format)的DataFrame转换为长格式(long format),以便于后续的聚合分析或可视化。特别是当多组相关数据分散在多个列中时,例如本例中的right_count, right_sum和left_count, left_sum,将其重塑为包含“侧边”(side)、“计数”(count)和“总和”(sum)等新列的长格式,能显著提高数据的可读性和可用性。
首先,我们定义一个初始的Pandas 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)我们的目标是将right_count, right_sum, left_count, left_sum这四列重塑为side、count和sum三列,同时保留date和other_col作为标识符。
这种方法通过巧妙地创建多级列索引(MultiIndex),然后使用stack操作将特定级别的索引转换为新的行,从而实现数据的重塑。
# 方法一:利用MultiIndex和stack进行自定义重塑
out_multiindex = (df
.set_index(['date', 'other_col']) # 将不变的列设为索引
# 将列名 'side_value' (如 'right_count') 拆分为多级索引 ('side', 'value')
.pipe(lambda x: x.set_axis(x.columns.str.split('_', expand=True), axis=1))
.rename_axis(columns=['side', None]) # 命名多级索引的级别,'side' 为第一个级别,第二个级别不命名
.stack('side') # 堆叠 'side' 级别的索引,将其转换为行
.reset_index() # 将所有索引(包括新生成的 'side')转换回普通列
)
print("\n方法一结果 (MultiIndex + stack):")
print(out_multiindex)解析:
这种方法是Pandas中处理宽长格式转换的经典组合,通过melt操作将多列“融化”为两列(变量名和值),然后通过字符串处理提取信息,最后使用pivot进行重塑。
# 方法二:结合melt和pivot实现重塑
tmp = df.melt(['date', 'other_col'], var_name='temp_col') # 先融化所有需要重塑的列
# 从新的列名 'temp_col' 中拆分出 'side' 和 'col' (如 'count' 或 'sum')
tmp[['side', 'col']] = tmp['temp_col'].str.split('_', n=1, expand=True)
out_melt_pivot = (tmp.pivot(index=['date', 'other_col', 'side'], # 设置新的行索引
columns='col', values='value') # 根据 'col' 进行透视,将 'value' 填充
.reset_index() # 将索引转换回列
.rename_axis(columns=None) # 清除透视产生的列名索引(默认为 'col')
)
print("\n方法二结果 (melt + pivot):")
print(out_melt_pivot)解析:
janitor是一个提供简洁、易用数据清理和转换函数的Python库。它的pivot_longer函数专门用于处理这种将多列重塑为长格式的场景,尤其当列名具有特定模式时,它能极大地简化代码。
# 方法三:使用janitor库的pivot_longer简化操作
# 如果尚未安装,请先执行:pip install pyjanitor
import janitor
out_janitor = df.pivot_longer(index=['date', 'other_col'],
names_to=('side', '.value'), # 指定新的列名,.value 是一个特殊关键字
names_pattern=r'([^_]+)_([^_]+)') # 正则表达式匹配 'side_value' 模式
print("\n方法三结果 (janitor.pivot_longer):")
print(out_janitor)解析:
以上三种方法都能实现将多列堆叠重塑为新列的目标,但它们各有特点和适用场景:
方法一(MultiIndex + stack):
方法二(melt + pivot):
方法三(janitor.pivot_longer):
在选择具体方法时,应综合考虑项目的依赖管理、团队成员的熟悉程度以及重塑任务的复杂性。对于日常的数据清洗和转换,janitor.pivot_longer无疑是一个非常强大的工具。如果项目不允许额外依赖,或者需要更精细的控制,melt与pivot的组合是稳健的选择。而基于MultiIndex的stack方法,则为处理更底层、更复杂的DataFrame结构提供了最大的灵活性。
以上就是Pandas DataFrame多列堆叠与重塑技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号