Pandas str.split报错:传递项数不符,求Entry列拆分解决方案
解决Pandas拆分「数字+文本」列的报错问题
你遇到的报错核心原因是列赋值的语法错误:你用了df['number','name']这种写法,Pandas会把它当成一个MultiIndex列名,而不是同时创建两个独立的列,正确的写法应该是用双层方括号df[['number', 'name']]。下面给你两种可靠的解决方案:
方案1:按空格拆分(适合数字后仅单个空格分隔的场景)
你之前用split(" ",n=1,expand=True)的逻辑是对的,只是赋值语法有误。修正后的代码如下:
import pandas as pd # 拆分Entry列为两列,赋值给新的number和name列 df[['number', 'name']] = df['Entry'].str.split(" ", n=1, expand=True) # 可选但推荐:把number列转换为数值类型 df['number'] = pd.to_numeric(df['number'])
执行后就能得到包含Date、number、name的三列DataFrame。
方案2:正则提取(更健壮,适合数字与名字间多空格的场景)
如果Entry列中数字和名字之间可能存在多个空格,或者你想更精准地匹配开头的连续数字,用str.extract会更可靠,它可以直接提取正则分组的内容:
import pandas as pd # 正则匹配开头的连续数字,以及后续所有文本 df[['number', 'name']] = df['Entry'].str.extract(r'^(\d+)\s+(.*)$', expand=True) # 转换number列类型 df['number'] = pd.to_numeric(df['number'])
这个正则的含义:
^(\d+):匹配字符串开头的1个或多个数字,作为第一个分组(对应number列)\s+:匹配一个或多个空格作为分隔符(.*)$:匹配剩余的所有文本直到结尾,作为第二个分组(对应name列)
为什么你之前的写法会报错?
- 第一种用
split('([0-9])',n=1,expand=True):这个正则会把单个数字单独拆分出来,比如"6 John Smith"会被拆成['', '6', ' John Smith'],得到3个元素,但你试图赋值给2个列,因此触发Wrong number of items passed 3的错误。 - 第二种用
split(" ",n=1,expand=True):拆分结果是2个元素,但你用了df['number','name']的赋值方式,Pandas认为你要给一个名为('number','name')的单列赋值,而非两个独立列,因此触发Wrong number of items passed 2的错误。
内容的提问来源于stack exchange,提问作者SOK
相关产品推荐
相关产品推荐

