Pandas列按空格数量处理:合并相邻单词及行复制需求
Pandas DataFrame文本拆分合并解决方案
原始数据
import pandas as pd df = pd.DataFrame({'id':[1,2],'col1':['a b c','a b c d']})
期望输出
pd.DataFrame({'id':[1,1,2],'col1':['ab c', 'a bc','ab cd']})
处理规则
- 列值仅包含1、2或3个空格
- 当列值含2个空格(对应3个单词):复制该行,分别生成「word1word2 word3」和「word1 word2word3」两种格式
- 当列值含3个空格(对应4个单词):转换为「word1word2 word3word4」格式
实现代码
1. 定义文本处理函数
先写一个处理单条文本的函数,根据单词数量判断处理逻辑:
def process_text(text): words = text.split() word_count = len(words) if word_count == 3: # 3个单词,生成两种合并格式 return [f"{words[0]}{words[1]} {words[2]}", f"{words[0]} {words[1]}{words[2]}"] elif word_count == 4: # 4个单词,合并前两个、后两个单词 return [f"{words[0]}{words[1]} {words[2]}{words[3]}"] else: # 2个单词(1个空格),返回原文本 return [text]
2. 批量处理目标列
针对需要处理的30列,循环处理并生成最终结果:
# 替换为你实际需要处理的30列名称 cols_to_process = ['col1'] # 初始化结果DataFrame,先保留唯一id final_df = df[['id']].drop_duplicates() for col in cols_to_process: # 对每一行文本处理,生成展开后的(id, 处理后文本)列表 expanded_rows = df.apply( lambda row: [(row['id'], processed_val) for processed_val in process_text(row[col])], axis=1 ) # 展开嵌套列表并转换为临时DataFrame temp_df = pd.DataFrame( [item for sublist in expanded_rows for item in sublist], columns=['id', col] ) # 按id合并到最终结果 final_df = final_df.merge(temp_df, on='id', how='right') # 查看最终结果 print(final_df)
代码说明
process_text函数通过split()拆分单词,根据单词数量返回对应格式的文本列表- 循环处理每一列时,通过
apply生成每行的多个结果,再将嵌套列表展开为单行记录 - 最后通过
merge按id合并所有列的处理结果,确保id与处理后文本一一对应
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

