如何使用Pandas高效重构数据集以支持探索性数据分析(EDA)?
Pandas宽表转长表(部门-变量年份列转年份-部门-变量值)
场景说明
你的原始数据以部门为行,列名格式为[变量名]_[年份](比如营收_2013、利润_2014),需要转成年份、部门、变量、变量值的长表结构,用Pandas可以通过两种简洁的方法实现,无需手动操作。
方法1:使用pivot_longer(推荐,Pandas 1.1.0+支持)
pivot_longer是专门为宽表转长表设计的API,语法更直观,适合初学者。
示例代码
import pandas as pd # 读取你的CSV数据 df = pd.read_csv('your_dataset.csv') # 执行重构 long_table = df.pivot_longer( id_cols='部门', # 固定作为行标识的列 names_to=['变量', '年份'], # 拆分后生成的两个新列名 names_pattern=r'(.*)_(.*)', # 正则匹配列名,拆分变量和年份(适配"变量_年份"格式) values_to='变量值' # 存储原列数值的新列名 ) # 可选:将年份转为整数类型 long_table['年份'] = long_table['年份'].astype(int)
参数解释
id_cols:指定不需要被转换的列(这里是"部门",每个部门的标识保留)names_to:定义拆分列名后生成的新列名称,对应正则匹配的分组顺序names_pattern:正则表达式,用来匹配原始列名的结构,把变量_年份拆分为两个分组values_to:给原列的数值指定新列名
方法2:使用melt + 字符串拆分(兼容旧版Pandas)
如果你的Pandas版本较低,用melt先把宽表转成中间表,再拆分列名。
示例代码
import pandas as pd df = pd.read_csv('your_dataset.csv') # 第一步:将所有变量年份列转为"变量_年份"和"变量值"两列 melted = df.melt(id_vars='部门', var_name='变量_年份', value_name='变量值') # 第二步:拆分"变量_年份"列为"变量"和"年份" melted[['变量', '年份']] = melted['变量_年份'].str.split('_', expand=True) # 第三步:清理临时列并调整列顺序 long_table = melted.drop('变量_年份', axis=1)[['部门', '年份', '变量', '变量值']] # 可选:转换年份类型 long_table['年份'] = long_table['年份'].astype(int)
注意事项
- 如果列名的分隔符不是下划线(比如空格、连字符),需要对应修改正则或拆分参数。例如列名是
营收2013,正则改为r'(.*)(\d{4})',拆分用str.extract(r'(.*)(\d{4})', expand=True) - 如果存在不规则列名,建议先清理列名(比如替换特殊字符)再执行转换,避免拆分失败
- 转换后可以用
long_table.head()查看前几行数据,验证结构是否符合预期
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

