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

DataFrame合并字符串列表忽略NaN时报TypeError,求错误原因

问题:合并DataFrame中字符串列表时触发TypeError错误

我有一个DataFrame的id列,包含字符串列表和NaN值,想要合并每个列表里的字符串同时跳过NaN值,尝试用df.loc、Series.notnull()和Series.apply()实现,但收到错误:TypeError: can only join an iterable.

创建DataFrame的代码:

import pandas as pd
import numpy as np

data = {'id': [['54930058LIMFSJIOLQ48'], np.nan, ['5493006B6WMKNQ8QNP51 254900425JAG3QVRMM28']]}
df = pd.DataFrame(data)

生成的DataFrame:

id
0  [54930058LIMFSJIOLQ48]
1                    NaN
2  [5493006B6WMKNQ8QNP51 254900425JAG3QVRMM28]

我使用的报错代码:

df.loc[df['id'].notnull(), 'id'] = df['id'].apply(lambda x: ', '.join(x))

错误原因

  • 核心问题是df['id'].apply(...)会遍历整个列的所有元素,包括NaN值。当x取到NaN时,', '.join(x)会直接报错——因为NaN不是可迭代对象,而join方法要求传入列表这类可迭代类型。
  • 虽然你用df.loc[df['id'].notnull()]筛选了要赋值的行,但右边的apply是对全列操作的,依然会处理到NaN,触发错误。

解决方法

方法一:在apply中加入非空判断

在lambda表达式里先检查x是否为NaN,仅对非NaN值执行合并操作:

df['id'] = df['id'].apply(lambda x: ', '.join(x) if pd.notnull(x) else x)

方法二:仅对非NaN行执行apply

先筛选出非NaN的行,再对这部分行单独执行apply,避免处理NaN:

mask = df['id'].notnull()
df.loc[mask, 'id'] = df.loc[mask, 'id'].apply(lambda x: ', '.join(x))

两种方法执行后,结果均为:

id
0  54930058LIMFSJIOLQ48
1                   NaN
2  5493006B6WMKNQ8QNP51 254900425JAG3QVRMM28

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:45:00