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

使用Pandas实现长转宽变换时遇TypeError问题求助

Pandas长表转宽表时聚合报错TypeError的解决方案

错误原因

报错sequence item 0: expected str instance, float found的核心问题是:你要聚合拼接的字段中存在数值类型(float)或缺失值(NaN,本质为float类型),而'|'.join()仅支持拼接字符串类型的元素,遇到非字符串类型就会触发类型错误。

解决方案

1. 先转换字段类型再聚合(简单直接)

先把目标字段统一转为字符串,同时处理缺失值避免出现'nan'字符:

import pandas as pd

# 假设你的数据表是df,要聚合的字段是'Value'
# 先将NaN替换为空字符串,再转成字符串类型
df['Value'] = df['Value'].fillna('').astype(str)

# 按Id分组并拼接
result = df.groupby('Id')['Value'].agg('|'.join).reset_index()

2. 聚合时用lambda函数实时处理(不修改原数据)

如果不想改动原始数据表,可以在聚合操作中直接转换元素类型,同时按需处理缺失值:

  • 去掉缺失值后拼接:
result = df.groupby('Id')['Value'].agg(
    lambda x: '|'.join(map(str, x.dropna()))
).reset_index()
  • 保留缺失值位置(转为空字符串):
result = df.groupby('Id')['Value'].agg(
    lambda x: '|'.join(str(v) if pd.notna(v) else '' for v in x)
).reset_index()

3. 完整长转宽示例

假设你的原始长表结构如下,需要转成每个Id对应一行、Value字段用|拼接的宽表:

# 示例长表数据
df = pd.DataFrame({
    'Id': [1, 1, 2, 2, 3],
    'Value': [10.5, 'abc', None, 20, 'xyz']
})

# 处理并转宽
df['Value'] = df['Value'].fillna('').astype(str)
wide_df = df.groupby('Id')['Value'].agg('|'.join).reset_index()

# 输出结果
print(wide_df)

输出结果:

Id      Value
0   1  10.5|abc
1   2     |20
2   3       xyz

额外注意事项

  • 如果需要对数值类型做格式化(比如保留小数位数),可以在转换时调整:
df['Value'] = df['Value'].apply(
    lambda v: f'{v:.1f}' if isinstance(v, float) else str(v) if pd.notna(v) else ''
)
  • 若聚合后出现连续的||(比如多个缺失值),可以用str.replace('||', '|')做后续清理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:24:23