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

为何无法对非数值列使用pivot_table?风向列透视问题求助

Pandas透视表处理字符串列的解决方案

你遇到的问题是pivot_table默认聚合函数对字符串无效导致的——它默认使用numpy.mean,这个函数无法处理字符串类型,所以只会返回索引,不会生成对应的字符串列。不需要把风向转成数值,只要指定适合字符串的聚合逻辑就能得到想要的结果。

核心解决思路

针对同一分组(CAMPAÑA+ID_ESTACION)和同一月份下的多个风向值,你需要定义一个聚合规则:比如取出现次数最多的众数(符合你的示例需求)、取第一个值、或者拼接所有唯一值等。

代码实现(基于你的示例数据)

先构造示例数据集:

import pandas as pd

data = {
    'mode': [0,1,2,3,4,5,6,7,8,9],
    'modeWinddirectiondiscrete': ['South','North','North','East','West','East','South','West','North','West'],
    'CAMPAÑA': [16,16,16,16,16,16,17,17,17,17],
    'ID_ESTACION': [0,0,0,0,0,0,1,1,1,1],
    'Month': [1,1,1,2,2,2,3,3,3,3]
}
df = pd.DataFrame(data)

使用指定聚合函数的pivot_table:

# 取每个分组-月份下出现次数最多的风向(众数)
pivot_df = df.pivot_table(
    index=['CAMPAÑA', 'ID_ESTACION'],
    columns='Month',
    values='modeWinddirectiondiscrete',
    aggfunc=lambda x: x.mode().iloc[0]  # 取众数,若有多个众数则取第一个
)

执行后得到的结果:

Month                  1     2     3
CAMPAÑA ID_ESTACION                 
16      0           North  East  NaN
17      1            NaN   NaN  West

可选聚合逻辑调整

如果你的需求不是取众数,可以替换aggfunc:

  • 取该分组-月份的第一个值:aggfunc=lambda x: x.iloc[0]
  • 拼接所有唯一风向:aggfunc=lambda x: ', '.join(x.unique())
  • 统计风向出现次数:aggfunc=lambda x: x.value_counts().to_dict()

内容的提问来源于stack exchange,提问作者Pablo Moreira Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:05:17