如何按字符串标签拆分Pandas DataFrame并重构数据格式?
单列含标签与XY数据的拆分最优方案
问题场景
我有包含XY数据集与标签的合并数据,所有内容位于单列中。需要在字符串标签后拆分数据集,拆分数值数据并添加标签列,实现从以下输入格式转换为目标输出格式:
输入格式
import pandas as pd df = pd.DataFrame.from_dict({'XYZ': ['Monday', '120 12', '119 51', '133 85', '1414 268', 'Wednesday', '3 62', '4 27', 'Friday', '23 100', '155 300', '123 400'], }) print(df)
目标输出格式
df2 = pd.DataFrame.from_dict( { 'X': ['120', '119', '133', '1414', '3', '4', '23', '155', '123'], 'Y': [ '12', '51', '85', '268', '62', '27', '100', '300', '400'], 'z': [ 'Monday', 'Monday', 'Monday', 'Monday', 'Wednesday', 'Wednesday', 'Friday', 'Friday', 'Friday'] } ) print(df2)
最优实现方法
用pandas矢量化操作完成,避免循环,效率高且代码简洁:
import pandas as pd df = pd.DataFrame.from_dict({'XYZ': ['Monday', '120 12', '119 51', '133 85', '1414 268', 'Wednesday', '3 62', '4 27', 'Friday', '23 100', '155 300', '123 400'], }) # 1. 识别纯文本标签行,向下填充标签到后续数据行 df['z'] = df['XYZ'].where(df['XYZ'].str.match(r'^\D+$')).ffill() # 2. 过滤掉原始标签行,仅保留含XY数值的行 df_numeric = df[~df['XYZ'].str.match(r'^\D+$')].copy() # 3. 按任意数量空格拆分XY列,生成X、Y两列 df_numeric[['X', 'Y']] = df_numeric['XYZ'].str.split(r'\s+', expand=True) # 4. 整理成目标格式,重置索引并保留需要的列 df2 = df_numeric[['X', 'Y', 'z']].reset_index(drop=True) print(df2)
方法说明
- 标签填充:通过正则
^\D+$识别纯文本标签行,再用ffill()将标签向下填充到所属的所有数据行,确保每个数据行对应正确标签。 - 行过滤:取反正则匹配结果,快速筛选出仅含数值的行。
- XY拆分:
str.split(r'\s+')适配数据中不规则的空格分隔情况,准确拆分X、Y值。 - 性能优势:全程使用pandas矢量化操作,比循环遍历效率高,尤其适合大规模数据处理。
内容的提问来源于stack exchange,提问作者nb5657
相关产品推荐
相关产品推荐

