如何将多列Pandas DataFrame重塑为指定的两列格式?
解决方案
可以通过分组后按列优先展开数据的方式快速实现需求,代码如下:
import pandas as pd df = pd.DataFrame({ 'col1': ['A', 'A', 'A', 'B', 'B', 'B'], 'col2': [1, 3, 5, 7, 9, 11], 'col3': [2, 4, 6, 8, 10, 12] }) # 按col1分组,将每组的col2、col3按列优先展开为一维序列 grouped = df.groupby('col1').apply(lambda x: pd.Series(x[['col2', 'col3']].values.ravel('F'))) # 转置后重置索引得到预期格式 df_result = grouped.T.reset_index(drop=True) print(df_result)
代码说明
values.ravel('F'):将每组的col2和col3数据按列优先的顺序展开(即先取第一行col2、col3,再第二行col2、col3,以此类推),正好匹配预期输出的元素顺序。- 分组后得到的结果以
col1的取值为行索引,转置后即可将分组名转为列名,重置索引后得到目标DataFrame。
替代方法(分步更清晰)
如果需要更直观的分步操作,也可以通过melt转长格式后再重塑:
# 将col2、col3转为长格式 melted = df.melt(id_vars='col1', value_vars=['col2', 'col3']) # 添加原行索引标记,保证排序后元素顺序正确 melted['row_id'] = melted.groupby('col1').cumcount() // 2 # 按分组、原行号、列名排序 melted = melted.sort_values(['col1', 'row_id', 'variable']) # 重塑为宽格式 df_result = melted.pivot(columns='col1', values='value').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者DECROMAX
相关产品推荐
相关产品推荐

