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,因为这个方法无法处理列表类型的数据。
正确的处理方式
分两种情况来解决:
- 直接处理列表列(推荐)
如果你的需求是把列表里的元素展开成多行,或者拆分成多列,根本不需要转成字符串再拆分,直接用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)
- 先转字符串再拆分(特殊需求场景)
如果确实需要先把列表转成逗号分隔的字符串再拆分(比如要对字符串做额外处理),可以用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_
相关产品推荐
相关产品推荐

