如何在Jupyter Notebook中使用Pandas转换指定DataFrame结构?
Pandas实现DataFrame宽表转长表(按月份拆分)
示例原始数据
先构造符合需求的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'Dept': ['HR', 'Engineering', 'Finance'], 'Name': ['Alice', 'Bob', 'Charlie'], 'Jan_Base': [5000, 8000, 6000], 'Feb_Base': [5200, 8200, 6100], 'Mar_Base': [5300, 8300, 6200], 'Jan_Count': [10, 15, 8], 'Feb_Count': [12, 16, 9], 'Mar_Count': [11, 17, 10] })
最优解决方案:wide_to_long
针对这种列名有固定规律(月份_指标)的场景,pd.wide_to_long是最简洁的实现方式:
# 转换宽表为长表 df_transformed = pd.wide_to_long( df, stubnames=['Base', 'Count'], # 指定指标列的前缀 i=['Dept', 'Name'], # 保留的标识列(不参与转换的列) j='Month', # 新生成的月份列名称 sep='_', # 列名中月份与指标的分隔符 suffix=r'\w+' # 匹配月份后缀(Jan/Feb/Mar这类字符串) ).reset_index() # 将月份缩写映射为数字1/2/3 month_mapping = {'Jan': 1, 'Feb': 2, 'Mar': 3} df_transformed['Month'] = df_transformed['Month'].map(month_mapping) # 调整列顺序(可选,按需排列) df_transformed = df_transformed[['Dept', 'Name', 'Month', 'Base', 'Count']]
备选方案:melt + 合并
如果列名规律不强,可使用melt分别处理两类指标后合并:
# 提取Base和Count类列 base_columns = [col for col in df.columns if '_Base' in col] count_columns = [col for col in df.columns if '_Count' in col] # 分别转换Base和Count部分 df_base = df.melt(id_vars=['Dept', 'Name'], value_vars=base_columns, var_name='Month', value_name='Base') df_count = df.melt(id_vars=['Dept', 'Name'], value_vars=count_columns, var_name='Month', value_name='Count') # 合并结果并处理月份列 df_transformed_melt = pd.merge(df_base, df_count, on=['Dept', 'Name', 'Month']) df_transformed_melt['Month'] = df_transformed_melt['Month'].str.split('_').str[0].map(month_mapping) # 调整列顺序 df_transformed_melt = df_transformed_melt[['Dept', 'Name', 'Month', 'Base', 'Count']]
转换后结果示例
最终的df_transformed结构如下:
Dept Name Month Base Count 0 HR Alice 1 5000 10 1 HR Alice 2 5200 12 2 HR Alice 3 5300 11 3 Engineering Bob 1 8000 15 4 Engineering Bob 2 8200 16 5 Engineering Bob 3 8300 17 6 Finance Charlie 1 6000 8 7 Finance Charlie 2 6100 9 8 Finance Charlie 3 6200 10
内容的提问来源于stack exchange,提问作者Sumedha Swayansidha
相关产品推荐
相关产品推荐

