如何将行列交替的Pandas DataFrame转换为标准列值格式?
Pandas长格式转标准宽格式解决方案
假设你的原始Pandas DataFrame为单列结构(列名暂定为data):偶数行存储列名,奇数行存储对应值,每32个列名-值对构成一行目标数据,总行数约10万。以下是高效的转换方法:
方法一:基于Numpy重塑(推荐,处理大数据更快)
import pandas as pd import numpy as np # 原始DataFrame为df,单列名为'data' # 将数据转为一维数组,按每64行(32组列名-值对)拆分 reshaped = df['data'].values.reshape(-1, 64) # 提取列名(取第一组的偶数位置元素,因列名重复) col_names = reshaped[0, ::2] # 提取每行对应的值(所有组的奇数位置元素) row_values = reshaped[:, 1::2] # 生成标准宽格式DataFrame result = pd.DataFrame(row_values, columns=col_names)
优势说明
Numpy的reshape是向量化操作,处理10万行数据几乎瞬间完成,比循环或逐行拼接效率高几个数量级。如果你的原始列名不是data,替换为实际列名即可。
方法二:分组透视(适用于列名不固定的场景)
如果不同数据组的列名存在差异,可采用分组透视的方式:
# 为每个列名-值对分配ID,每32对划为一个数据组 df['pair_id'] = np.arange(len(df)) // 2 df['group_id'] = df['pair_id'] // 32 # 透视生成宽表,筛选出值列 pivot_result = df.pivot(index='group_id', columns='pair_id', values='data') result = pivot_result.iloc[:, 1::2] # 为结果表匹配对应列名 result.columns = df[df['pair_id'] % 2 == 0].groupby('group_id')['data'].first().values
内容的提问来源于stack exchange,提问作者SmoothTobacco
相关产品推荐
相关产品推荐

