将带时间索引的多列Pandas DataFrame重塑为两列结构
高效转换带时间索引的多列Pandas DataFrame
针对你需要将带时间索引的多列DataFrame转换为原列名作为新索引、时间+数值为两列的需求,推荐使用Pandas内置的stack()方法,这是处理大数据量重复转换的高效方案。
示例代码
首先构造符合你示例的测试数据:
import pandas as pd # 构造原始DataFrame(索引为时间列) df = pd.DataFrame( {'p1': [1, 2, 3], 'p2': [4, 5, 6], 'p3': [7, 8, 9]}, index=[1, 6, 11] ) df.index.name = 'time' # 为索引命名,便于后续处理
执行转换操作:
# 核心转换步骤 result = df.stack().reset_index() # 重命名列并设置新索引 result.columns = ['time', 'new_index', 'vals'] result = result.set_index('new_index')
转换后得到的DataFrame与你的需求完全一致:
time vals new_index p1 1 1 p1 6 2 p1 11 3 p2 1 4 p2 6 5 p2 11 6 p3 1 7 p3 6 8 p3 11 9
高效性说明
stack()是Pandas底层优化的向量操作,基于numpy数组实现,避免了Python循环的开销,处理大数据量时性能远优于自定义逻辑。- 提前为原始DataFrame的索引命名(
df.index.name = 'time')可以减少后续列重命名的额外操作,进一步提升效率。 - 如果需要重复执行转换,确保原始DataFrame的索引和列数据类型统一(如数值型),避免类型转换带来的性能损耗。
内容的提问来源于stack exchange,提问作者András Jakab
相关产品推荐
相关产品推荐

