如何使用Pandas与NumPy将多列DataFrame转换为长格式?
Pandas实现宽格式DataFrame转长格式
步骤1:模拟初始宽格式数据
根据你提供的表格结构,先构造对应的宽格式示例(实际使用时替换为你的真实数据即可):
import pandas as pd import numpy as np # 模拟宽格式输入数据 df_wide = pd.DataFrame({ 'Name': ['A', 'A-Jay', 'A.J.', 'Aaban'], '2017': [4.0, np.nan, np.nan, np.nan], '2018': [4.0, np.nan, np.nan, np.nan], '2019': [10.0, np.nan, 3.0, np.nan], '2020': [4.0, 6.0, np.nan, 4.0], '2021': [5.0, 5.0, np.nan, 4.0] })
步骤2:使用melt转换为长格式
Pandas的melt方法是处理宽转长的标准工具,一行代码就能完成转换:
# 宽转长核心操作 df_long = df_wide.melt( id_vars='Name', # 固定保留的标识符列 var_name='Year', # 原年份列名对应的新列名 value_name='Nb', # 原数值对应的新列名 ignore_index=True # 重置结果的索引 ).dropna(subset=['Nb']) # 过滤掉无数值的行
步骤3:优化数据类型(可选)
转换后Year列是字符串类型,可转为整数:
df_long['Year'] = df_long['Year'].astype(int)
最终结果
按名称和年份排序后,输出结果与你要求的长格式完全一致:
# 按名称升序、年份降序排序并重置索引 df_final = df_long.sort_values(by=['Name', 'Year'], ascending=[True, False]).reset_index(drop=True) print(df_final)
输出示例:
Name Year Nb 0 A 2021 5.0 1 A 2020 4.0 2 A 2019 10.0 3 A 2018 4.0 4 A 2017 4.0 5 A-Jay 2021 5.0 6 A-Jay 2020 6.0 7 A.J. 2019 3.0 8 Aaban 2021 4.0 9 Aaban 2020 4.0
内容的提问来源于stack exchange,提问作者pinkiBet
相关产品推荐
相关产品推荐

