pandas合并空行间连续行并保留空行的实现问题
问题1:调整分组标识
s的逻辑 原来的分组逻辑把空白行算入了下一组非空白行的分组,导致空白行丢失、空字符串被拼接到下一段文本开头。
正确的分组逻辑需要满足两个规则:
- 连续的非空白行分到同一组
- 每个空白行单独作为一组
分组标识s的计算代码如下:
# 触发分组切换的条件:当前行是空白行,或者上一行是空白行(新段落开始) s = (df['text'].eq('') | df['text'].shift(fill_value='').eq('')).cumsum()
这个逻辑对应你的示例数据会生成4个分组,刚好匹配期望的输出分组规则。
问题2:条件拼接文本的实现
pandas没有直接名为mutate if的内置方法,但可以通过自定义聚合函数实现条件拼接的需求,逻辑是遍历待拼接的文本列表,仅在前一段文本不以标点结尾时才加句号拼接。
自定义拼接函数示例:
def conditional_join(text_series): # 先过滤掉空文本 valid_texts = [t.strip() for t in text_series if t.strip()] if not valid_texts: return '' merged = valid_texts[0] for next_text in valid_texts[1:]: # 判断前一句末尾是否有结束标点,可根据需求补充其他标点 if not merged.endswith(('.', '!', '?')): merged += '. ' + next_text else: merged += ' ' + next_text return merged
完整运行代码
import pandas as pd # 示例输入 df = pd.DataFrame(data = [[1, "A Heading"], [2, "I need to be with above."], [3, ""], [8, "I stand alone."], [9, ""]],columns=['para_id','text']) # 计算分组标识 s = (df['text'].eq('') | df['text'].shift(fill_value='').eq('')).cumsum() # 自定义拼接函数 def conditional_join(text_series): valid_texts = [t.strip() for t in text_series if t.strip()] if not valid_texts: return '' merged = valid_texts[0] for next_text in valid_texts[1:]: if not merged.endswith(('.', '!', '?')): merged += '. ' + next_text else: merged += ' ' + next_text return merged # 聚合得到结果 out = df.groupby(s).agg({ 'para_id': 'first', 'text': conditional_join }).reset_index(drop=True) print(out)
运行输出和期望结果一致:
para_id text 0 1 A Heading. I need to be with above. 1 3 2 8 I stand alone. 3 9
内容的提问来源于stack exchange,提问作者micstr
相关产品推荐
相关产品推荐

