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

Pandas DataFrame转置:pivot_table的aggfunc失效问题求助

问题

原始DataFrame:

x   y     z
0  1  Mn  6.78
1  1  na   7.4
2  2  al    32

期望得到的转置结果:

x  mn     na    al
1  6.78   7.4   0
2   0     0     32

当前使用的代码:

import pandas as pd
import numpy as np
data=[['1','Mn','6.78'],['1','na','7.4'],['2','al','32']]
df = pd.DataFrame(data,columns=['x','y','z'])
print(df)
print(df.pivot_table(index='x', columns='y', aggfunc=len,values='z'))

实际错误输出:

y   Mn   al   na
x               
1  1.0  NaN  1.0
2  NaN  1.0  NaN

核心问题:pivot_table的aggfunc未正常工作,无法正确填充z列的数值。

解决方案

问题根源

  1. aggfunc参数错误:使用len是统计每个(x,y)分组的行数,而非提取z列的实际数值。
  2. 数据类型不匹配:原始数据中z是字符串类型,聚合函数无法正确处理数值计算。
  3. 列名大小写不一致:期望输出列名为小写,但原始数据y列存在大写值(如Mn),需统一格式。
  4. 缺失值未替换:期望用0填充空值,但当前输出为NaN。

修正代码

方法一:用pivot_table(适配有重复(x,y)组合的场景)

import pandas as pd
import numpy as np

data=[['1','Mn','6.78'],['1','na','7.4'],['2','al','32']]
df = pd.DataFrame(data,columns=['x','y','z'])

# 将z列转换为数值类型
df['z'] = pd.to_numeric(df['z'])
# 统一y列的大小写为小写
df['y'] = df['y'].str.lower()

# 使用first作为聚合函数(每个(x,y)仅对应一个z值),填充空值为0
result = df.pivot_table(index='x', columns='y', values='z', aggfunc='first', fill_value=0)
# 重置索引,让x成为普通列
result = result.reset_index()
# 调整列顺序匹配期望输出
result = result[['x', 'mn', 'na', 'al']]

print(result)

输出结果:

x    mn   na  al
0  1  6.78  7.4   0
1  2  0.00  0.0  32

方法二:用pivot(适配无重复(x,y)组合的场景,代码更简洁)

import pandas as pd
import numpy as np

data=[['1','Mn','6.78'],['1','na','7.4'],['2','al','32']]
df = pd.DataFrame(data,columns=['x','y','z'])

df['z'] = pd.to_numeric(df['z'])
df['y'] = df['y'].str.lower()

# pivot适用于每个(index, columns)唯一的场景,直接转置后填充空值为0
result = df.pivot(index='x', columns='y', values='z').fillna(0).reset_index()
# 可选:调整列顺序匹配期望输出
result = result[['x', 'mn', 'na', 'al']]

print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:00:05