如何用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
相关产品推荐
相关产品推荐

