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

Pandas str.split(',')返回NaN,如何正确拆分clusters列?

DataFrame拆分clusters列返回NaN的问题分析与解决

你从字典创建了这样的DataFrame:

clusters
OG1.5_1000 [6243|g1697.t1_CBS136243, 6243|g7411.t1_CBS136...]
OG1.5_1001 [2003|g3159.t1_CBS132003, 2003|g4503.t1_CBS132...]
OG1.5_1002 [4916|g1071.t1_CBS134916, 4916|g1248.t1_CBS134...]
OG1.5_1003 [4916|g913.t1_CBS134916, 4920|g2467.t1_CBS1349...]
OG1.5_1004 [2003|g2248.t1_CBS132003, 2003|g3254.t1_CBS132...]
OG1.5_1005 [2003|g1615.t1_CBS132003, 2003|g1622.t1_CBS132...]

结果调用df['clusters'].str.split(',')拆分后,返回了一堆NaN:

OG1.5_1001 NaN
OG1.5_1002 NaN
OG1.5_1003 NaN
OG1.5_1004 NaN
OG1.5_1005 NaN

问题原因

核心问题出在数据类型上!str.split()是pandas专门给字符串类型列设计的方法,而你的clusters列里的元素根本不是字符串——它们是列表(list)类型!因为你从字典创建DataFrame的时候,clusters对应的value本身就是列表,所以存入DataFrame后,这一列的dtype是object,但实际存储的是列表对象。当你对非字符串元素调用str.split()时,pandas就会返回NaN,因为这个方法无法处理列表类型的数据。

正确的处理方式

分两种情况来解决:

  1. 直接处理列表列(推荐)
    如果你的需求是把列表里的元素展开成多行,或者拆分成多列,根本不需要转成字符串再拆分,直接用pandas的explode()方法就行:
# 把列表展开成多行
expanded_df = df.explode('clusters')

如果要把列表拆分成多列,可以用apply(pd.Series):

# 把列表拆分成多列,列名默认是0、1、...
split_cols = df['clusters'].apply(pd.Series)
# 合并回原DataFrame
df = pd.concat([df, split_cols], axis=1)
  1. 先转字符串再拆分(特殊需求场景)
    如果确实需要先把列表转成逗号分隔的字符串再拆分(比如要对字符串做额外处理),可以用apply()把列表转成字符串,再调用str.split():
# 先将列表转为逗号分隔的字符串,再拆分
df['split_clusters'] = df['clusters'].apply(lambda x: ','.join(x)).str.split(',')

要是担心列里混有非列表元素,可以加个类型判断:

df['split_clusters'] = df['clusters'].apply(
    lambda x: x if isinstance(x, list) else str(x).split(',')
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:46:16