如何用Python Pandas对含多值列的表格进行水平透视?
使用Pandas实现表格水平透视(行转列)
需求说明
原始表格格式:
Ticker Financial Ratio 2001 2002 2003 ARKR Net Profit Margin -0.1931 0.052 -0.0187 ARKR Return on Assets 0 0 0 ARKR Current Ratio 1.3419 1.2096 0.7031 ARMK Net Profit Margin -0.1931 0.052 -0.0187 ARMK Return on Assets 0 0 0 ARMK Current Ratio 1.3419 1.2096 0.7031
需要转换为:仅保留Ticker为纵向列,将年份与财务指标组合为新列名,对应数值平铺到一行:
Ticker 2001 Net Profit Margin 2001 Return on Assets 2001 Current Ratio 2002 Net Profit Margin ... ARKR -0.1931 0 1.3419 0.052 ... ARMK -0.1931 0 1.3419 0.052 ...
正确实现代码
import pandas as pd from io import StringIO # 读取数据(示例用字符串读取,实际替换为pd.read_csv('database_raw.csv', skipinitialspace=True)) data = """Ticker Financial Ratio 2001 2002 2003 ARKR Net Profit Margin -0.1931 0.052 -0.0187 ARKR Return on Assets 0 0 0 ARKR Current Ratio 1.3419 1.2096 0.7031 ARMK Net Profit Margin -0.1931 0.052 -0.0187 ARMK Return on Assets 0 0 0 ARMK Current Ratio 1.3419 1.2096 0.7031""" df = pd.read_csv(StringIO(data), sep='\s+', skipinitialspace=True) # 1. 将年份列转为长格式,拆分年份和对应数值 melted_df = df.melt( id_vars=['Ticker', 'Financial Ratio'], var_name='Year', value_name='Value' ) # 2. 组合年份与财务指标,生成新列名 melted_df['Metric'] = melted_df['Year'] + ' ' + melted_df['Financial Ratio'] # 3. 透视得到目标格式,重置索引让Ticker回到普通列 result_df = melted_df.pivot( index='Ticker', columns='Metric', values='Value' ).reset_index() # 清除列索引的名称,让格式更简洁 result_df.columns.name = None # 输出结果 print(result_df)
代码说明
melt():把原始宽格式中的年份列(2001/2002/2003)拆分为Year(年份)和Value(对应指标值),保留Ticker和Financial Ratio作为标识列,将数据转为长格式。- 列名拼接:将
Year和Financial Ratio合并为新的指标名称,比如2001 Net Profit Margin,满足目标格式的列名要求。 pivot():以Ticker为行索引,新生成的Metric为列,Value为填充值,实现行转列的透视效果;reset_index()将Ticker从索引转回普通列,columns.name = None清除列索引的冗余名称。
内容的提问来源于stack exchange,提问作者Vivek Tangudu
相关产品推荐
相关产品推荐

