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
相关产品推荐
相关产品推荐

