如何在Pandas中合并特定连续行并替换为指定值?
解决Pandas中分组内连续特定行合并替换的问题
需求分析
在同一uniqueID分组内,找到连续的'hello'后接'goodbye'的行对,将这两行合并为一行并替换为'greeting',保留原hello行的idx,删除后续的goodbye行,其余行保持原样。
实现步骤及代码
1. 数据预处理(清理字符串引号)
读取数据后,先清理String列的单引号,避免后续匹配判断出错:
import pandas as pd df = pd.read_csv('filename.csv', delimiter=',') # 移除String列的单引号 df['String'] = df['String'].str.strip("'")
2. 标记目标行
通过分组内的行偏移(shift),精准标记需要替换的hello行和需要删除的goodbye行:
# 标记当前行是hello且下一行是goodbye的行(需要替换为greeting) df['is_target_hello'] = df['String'] == 'hello' df['next_is_goodbye'] = df.groupby('uniqueID')['String'].shift(-1) == 'goodbye' df['need_replace'] = df['is_target_hello'] & df['next_is_goodbye'] # 标记当前行是goodbye且上一行是hello的行(需要删除) df['is_target_goodbye'] = df['String'] == 'goodbye' df['prev_is_hello'] = df.groupby('uniqueID')['String'].shift(1) == 'hello' df['need_drop'] = df['is_target_goodbye'] & df['prev_is_hello']
3. 替换并过滤行
将标记的行替换为目标字符串,再过滤掉需要删除的行,最后清理临时辅助列:
# 把需要替换的行的String改为greeting df.loc[df['need_replace'], 'String'] = 'greeting' # 过滤掉要删除的行,同时移除临时列 result_df = df[~df['need_drop']].drop(columns=['is_target_hello', 'next_is_goodbye', 'need_replace', 'is_target_goodbye', 'prev_is_hello', 'need_drop']) # 可选:恢复String列的单引号格式 result_df['String'] = "'" + result_df['String'] + "'" print(result_df)
代码说明
- 用
groupby('uniqueID')限定仅在同一分组内判断连续行,避免跨分组误匹配; shift(-1)和shift(1)分别获取当前行的下一行、上一行值,结合布尔判断精准定位目标行对;- 通过布尔索引过滤行,确保只保留需要的内容,同时清理临时列避免数据冗余。
内容的提问来源于stack exchange,提问作者Ev0
相关产品推荐
相关产品推荐

