如何将Pandas中读取的交叉表转换为长格式?
解决Pandas宽表转长表问题
你的问题核心是初始DataFrame的表头结构异常——实际列名被存放在第一行数据中,而非真正的列名位置,导致pd.wide_to_long()和pd.stack()无法正常工作。按以下步骤处理即可:
步骤1:修复DataFrame的表头结构
假设读取Excel后得到的DataFrame名为df,先将第一行数据设为列名,再截取有效数据行:
# 将第一行设为列名 df.columns = df.iloc[0] # 从第二行开始取有效数据,重置索引 df = df.iloc[1:].reset_index(drop=True)
处理后,DataFrame会变为正常的宽格式:
row_name col_a col_b col_c col_d col_e 0 label_1 0.3 0.106628494 0.049496617 0.029875719 0.029444018 1 label_2 0.4 0.287788288 0.016961146 0.014512181 0.012937216 2 label_3 0.5 0.428264132 0.317066974 0.046346238 0.005149056 3 label_4 0.6 0.176474306 0.134044892 0.12476623 0.062386211 4 label_5 0.7 0.015996073 0.00574499 0.005136634 0.000789726
步骤2:用melt转换为长格式
使用Pandas的melt方法,指定保留的行标识列,以及目标长格式的列名:
# 转换为长格式 long_df = df.melt( id_vars='row_name', var_name='col_name', value_name='value' ) # 可选:将value列转为数值类型(避免读取后为字符串格式) long_df['value'] = pd.to_numeric(long_df['value'])
最终得到的long_df就是你需要的长格式结构:
row_name col_name value 0 label_1 col_a 0.3000000 1 label_2 col_a 0.4000000 2 label_3 col_a 0.5000000 3 label_4 col_a 0.6000000 4 label_5 col_a 0.7000000 5 label_1 col_b 0.1066285 6 label_2 col_b 0.2877883 7 label_3 col_b 0.4282641 8 label_4 col_b 0.1764743 9 label_5 col_b 0.0159961 ...
内容的提问来源于stack exchange,提问作者J. Jenkins
相关产品推荐
相关产品推荐

