Python pandas数据帧清洗:转置首行、合并重复列
Pandas 数据清洗解决方案
步骤1:重构列名关联年份与指标
先提取原始数据的年份和指标元信息,构建多级列名,明确每列对应的年份和统计指标:
import pandas as pd # 原始数据 df_bad = pd.DataFrame({'col1': ['years', 'country', 'Afghanistan', 'Albania', 'Algeria', 'Andorra'], 'col2': [1972, 'political_rights', 4, 7, 6, 4], 'col3': [1972, 'civil_liberties', 5, 7, 6, 3], 'col4': [1972, 'status', 'PF', 'NF', 'NF', 'NF'], 'col5': [1973, 'political_rights', 7, 7, 6, 4], 'col6': [1973, 'civil_liberties', 6, 7, 6, 4], 'col7': [1973, 'status', 'NF', 'NF', 'NF', 'PF']}) # 提取年份和指标列表(跳过第一列的标识项) years = df_bad.iloc[0, 1:].tolist() indicators = df_bad.iloc[1, 1:].tolist() # 为数据列设置(年份, 指标)的多级列名 df_bad.columns = ['country'] + list(zip(years, indicators))
步骤2:清理数据并转置为长表
移除前两行元数据,保留国家数据后,将宽表转成长表,拆分年份和指标字段:
# 保留从第三行开始的国家数据 df_clean = df_bad.iloc[2:].reset_index(drop=True) # 转置为长表,同时保留国家、年份、指标、对应值的关联 df_melted = df_clean.melt(id_vars='country', var_name=('years', 'indicator'), value_name='value') # 将多级字段拆分为单独列 df_melted[['years', 'indicator']] = pd.DataFrame(df_melted['years'].tolist(), index=df_melted.index)
步骤3:重塑为目标格式
通过透视将指标转为独立列,得到符合要求的整洁数据:
# 透视表重构数据结构 df_final = df_melted.pivot(index=['country', 'years'], columns='indicator', values='value').reset_index() # 调整列顺序与目标一致 df_final = df_final[['country', 'years', 'political_rights', 'civil_liberties', 'status']] # 修正数据类型(确保年份和指标为整数类型) df_final['years'] = df_final['years'].astype(int) df_final['political_rights'] = df_final['political_rights'].astype(int) df_final['civil_liberties'] = df_final['civil_liberties'].astype(int)
验证结果
运行后df_final输出与目标数据匹配:
country years political_rights civil_liberties status 0 Afghanistan 1972 4 5 PF 1 Afghanistan 1973 7 6 NF 2 Albania 1972 7 7 NF 3 Albania 1973 7 7 NF 4 Algeria 1972 6 6 NF 5 Algeria 1973 6 6 NF 6 Andorra 1972 4 3 NF 7 Andorra 1973 4 4 PF
内容的提问来源于stack exchange,提问作者Kiah Jane Jones
相关产品推荐
相关产品推荐

