使用Pandas进行数据重塑时遇类型错误,求解决方案
问题:宽格式转长格式数据转换错误排查
原始数据
Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | Unnamed: 6 | Unnamed: 7 0 NaN | 202201 | Nan | 202202 | Nan | 202203 | Nan 1 group | A Count | B Count | A Count | B Count | A Count | B Count 2 Part1 | 40 | 30 | 20 | 10 | 5 | 0 3 Part2 | 0 | 5 | 10 | 20 | 30 | 40
期望输出
group | date | A Count | B Count 0 part1 | 202201 | 40 | 30 1 part1 | 202202 | 20 | 10 2 part1 | 202203 | 5 | 0 3 part2 | 202201 | 0 | 5 4 part2 | 202202 | 10 | 20 5 part2 | 202203 | 30 | 40
错误分析
运行代码时出现两个核心问题:
- 过时API警告:
fillna(method='ffill')已被弃用,需改用ffill()方法 - 类型与聚合错误:
pivot_table默认使用mean聚合函数,但value列是字符串类型无法计算均值;且数据每个分组唯一,完全不需要聚合操作
修正后的代码
import pandas as pd import numpy as np df = pd.DataFrame({'Unnamed: 1':[np.nan, 'group', 'Part1', 'Part2'], 'Unnamed: 2':['202201', 'A Count', '40', '0'], 'Unnamed: 3':[np.nan, 'B Count', '30', '5'], 'Unnamed: 4':['202202', 'A Count', '20', '10'], 'Unnamed: 5':[np.nan, 'B Count', '10', '20'], 'Unnamed: 6':['202203', 'A Count', '5', '30'], 'Unnamed: 7':[np.nan, 'B Count', '0', '40']}) # 转置并设置列名 df = df.T.reset_index(drop=True) df.columns = df.iloc[0] df.drop(index=0, inplace=True) # 替换过时的fillna写法,改用ffill() df['date'] = df[np.nan].ffill() df.drop(columns=[np.nan], inplace=True) # 重塑数据:先melt,再用pivot替代pivot_table(避免默认聚合) melted = pd.melt(df, id_vars=['date', 'group'], var_name='count_type', value_name='value') # 转换value为数值类型,确保数据格式正确 melted['value'] = pd.to_numeric(melted['value']) # 用pivot重新整理,无需求聚合 result = melted.pivot(index=['group', 'date'], columns='count_type', values='value').reset_index() # 调整列名和顺序,匹配期望输出 result.columns.name = None result = result[['group', 'date', 'A Count', 'B Count']] # 把group值转为小写,对齐期望输出格式 result['group'] = result['group'].str.lower() print(result)
代码说明
- 替换
fillna(method='ffill')为ffill(),消除过时警告 - 将
pivot_table改为pivot,因为每个(group, date, count_type)组合唯一,不需要聚合计算 - 转换
value列为数值类型,避免后续操作的类型错误 - 调整列名顺序和
group值的大小写,完全匹配期望输出格式
内容的提问来源于stack exchange,提问作者Junda
相关产品推荐
相关产品推荐

