如何在Pandas或Python中将CrossTab交叉表转换为普通DataFrame
交叉表转目标DataFrame实现方法(基于Python pandas)
前置准备
首先将原始交叉表读入为pandas DataFrame,设置第一列的分类(Intermittent、Lumpy、Unknown)为行索引,顶部的四个分类(Erratic、Intermittent、Lumpy、Smooth)为列名。如果是从本地csv读取可以直接用以下代码:
import pandas as pd # 读入外部文件时指定第一列为索引 df_crosstab = pd.read_csv('你的文件路径.csv', index_col=0)
如果是手动构造测试数据,可以用以下代码:
df_crosstab = pd.DataFrame( data=[ [20, 77, 9, 450], [10, 6, 1, 13], [0, 13, 1, 1] ], index=['Intermittent', 'Lumpy', 'Unknown'], columns=['Erratic', 'Intermittent', 'Lumpy', 'Smooth'] )
实现方式1:stack() 方法(代码最简洁)
stack()会直接把列名转为内层索引,再重置索引就能得到长格式结果:
df_result = df_crosstab.stack().reset_index() # 按要求重命名列 df_result.columns = ['1', '2', 'Value']
实现方式2:melt() 方法(更灵活可控)
如果需要自定义排序、过滤逻辑,用melt()更方便:
df_result = df_crosstab.reset_index().melt( id_vars='index', var_name='2', value_name='Value' ).rename(columns={'index':'1'}) # 如需和示例完全一致的排序规则,加一行排序代码 df_result = df_result.sort_values(by=['2', '1']).reset_index(drop=True)
两种方法输出的结果和你给出的预期格式完全匹配。
内容的提问来源于stack exchange,提问作者Kyra
相关产品推荐
相关产品推荐

