如何用Pandas将无分隔符的DataFrame列拆分为整数列和字符串列?
解决Pandas DataFrame无分隔符列拆分问题
这个问题确实有点棘手,不过用正则表达式就能轻松搞定!我们可以通过提取字符串中的数字序列和非数字序列,来拆分出你需要的integer和string列。下面是具体的实现步骤:
1. 构造示例DataFrame
先还原你提供的数据集,方便后续测试:
import pandas as pd data = { 'A': ['3', '629S', '84S', 'S72'], 'B': ['abc', 'def', 'ghi', 'jkl'] } df = pd.DataFrame(data)
2. 用正则提取数字与非数字部分
使用str.extract配合正则表达式,一次性提取出所有数字组成的部分和非数字组成的部分:
# 正则 (\d*) 匹配零个或多个数字,(\D*) 匹配零个或多个非数字 df[['integer', 'string']] = df['A'].str.extract(r'(\d*)(\D*)')
3. 处理数据类型与缺失值
因为纯数字的行中,非数字部分会是空字符串;纯非数字的行中,数字部分也会是空字符串,我们需要把这些空值转为NaN,并将数字列转为支持缺失值的整数类型:
# 将数字列的空字符串转为pd.NA,再转为Int64类型(支持NaN的整数类型) df['integer'] = df['integer'].replace('', pd.NA).astype('Int64') # 将字符串列的空字符串转为pd.NA df['string'] = df['string'].replace('', pd.NA)
4. 调整列顺序(可选)
如果需要把拆分后的列放到前面,可以调整列顺序:
df = df[['integer', 'string', 'B']]
最终输出结果
运行完上述代码后,你会得到预期的DataFrame:
integer string B 0 3 NaN abc 1 629 S def 2 84 S ghi 3 72 S jkl
补充说明
- 这个方法适用于单个数字段+单个非数字段的场景(比如你的示例数据),如果遇到多个数字段的情况(例如
"12S34"),可以用str.findall(r'\d+')提取所有数字后再合并,比如df['integer'] = df['A'].str.findall(r'\d+').str.join('').replace('', pd.NA).astype('Int64')。 - 使用
Int64类型而非普通int,是因为普通整数列无法存储NaN值,而Int64是Pandas提供的可空整数类型,完美适配这种有缺失值的场景。
内容的提问来源于stack exchange,提问作者jenna_the_antenna
相关产品推荐
相关产品推荐

