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

如何用Python/Pandas实现类似PowerQuery的字符转换拆分DataFrame列

实现Excel/PowerQuery中Splitter.SplitTextByCharacterTransition的Pandas等效功能

你需要的是按字符类型转换拆分字符串(比如数字与字母的分界处),之前的代码错误在于itertools.groupby(df['Col1'])是对整个列的字符串元素分组,而非对单个字符串内部的字符按类型分组,所以无法实现拆分。以下是两种可行的解决方案:

方法1:使用itertools.groupby按字符类型分组

核心是对每个字符串的字符,用isdigit()判断是否为数字作为分组键,将连续同类型的字符归为一组,再拼接成拆分后的片段:

import pandas as pd
import itertools

df = pd.DataFrame({'Col1': ['304', '321A', '14', '319B', '315', '88', '242C', '243']})

# 对每个字符串按字符是否为数字分组,拆分后转为多列
df[['Col2', 'Col3']] = df['Col1'].apply(
    lambda s: pd.Series([''.join(group) for _, group in itertools.groupby(s, key=lambda c: c.isdigit())])
)

print(df)

运行结果:

Col1 Col2  Col3
0   304  304   NaN
1  321A  321     A
2    14   14   NaN
3  319B  319     B
4   315  315   NaN
5    88   88   NaN
6  242C  242     C
7   243  243   NaN

方法2:使用正则表达式(更简洁)

用正则匹配连续数字或非数字片段,效果与Splitter.SplitTextByCharacterTransition完全一致:

import pandas as pd
import re

df = pd.DataFrame({'Col1': ['304', '321A', '14', '319B', '315', '88', '242C', '243']})

# 匹配连续数字(\d+)或连续非数字(\D+)
df[['Col2', 'Col3']] = df['Col1'].apply(
    lambda s: pd.Series(re.findall(r'\d+|\D+', s))
)

print(df)

运行结果与方法1相同。

补充说明

如果只需要拆分出数字部分(即你的Col2需求),可以直接取拆分后的第一个元素:

# groupby版本
df['Col2'] = df['Col1'].apply(lambda s: ''.join(next(itertools.groupby(s, key=lambda c: c.isdigit()))[1]))

# 正则版本
df['Col2'] = df['Col1'].apply(lambda s: re.findall(r'\d+', s)[0])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:57:37