You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

代码说明

  1. 替换fillna(method='ffill')为ffill(),消除过时警告
  2. 将pivot_table改为pivot,因为每个(group, date, count_type)组合唯一,不需要聚合计算
  3. 转换value列为数值类型,避免后续操作的类型错误
  4. 调整列名顺序和group值的大小写,完全匹配期望输出格式

内容的提问来源于stack exchange,提问作者Junda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:49:51