Python中基于DataFrame2的ID与Query过滤DataFrame1,提取指定Query之后的Support Team数据
解决方法:按ID分组定位对话后续的支持团队回复
我来帮你搞定这个问题!你之前遇到的KeyError是因为用loc直接按Query字符串切片完全不对——loc是按DataFrame的索引值来操作的,而你的df1索引是无序的数字,根本不是Query内容,自然会报错。而且就算Query是索引,无序的索引切片也不会按对话的先后顺序来筛选,完全不符合你的需求。
核心思路
我们需要先给每个ID的对话组标记顺序,然后精准定位目标Query在组内的位置,再筛选该位置之后的支持团队回复:
- 给df1的每个ID分组添加组内对话序号,用来标记同ID下的对话先后顺序
- 遍历df2的每一行,找到对应ID和Query在df1中的位置序号
- 在对应ID组里,筛选序号大于目标位置且
Sent by为Support Team的行 - 合并所有符合条件的行得到最终结果
完整代码
import pandas as pd # 假设你的df1和df2已经加载完成,先给df1添加组内对话序号 df1['group_order'] = df1.groupby('ID').cumcount() # 初始化结果列表 result_rows = [] # 遍历df2的每一条查询 for _, target_row in df2.iterrows(): target_id = target_row['ID'] target_query = target_row['Query'] # 找到df1中匹配ID和Query的行,获取它的组内序号 matched_row = df1[(df1['ID'] == target_id) & (df1['Query'] == target_query)] if matched_row.empty: # 如果没有找到对应的对话(比如df2里的77832条目),直接跳过 continue target_order = matched_row['group_order'].iloc[0] # 筛选对应ID组中,在目标Query之后的支持团队回复 filtered_data = df1[ (df1['ID'] == target_id) & (df1['group_order'] > target_order) & (df1['Sent by'] == 'Support Team') ] result_rows.append(filtered_data) # 合并结果并清理不必要的列 final_result = pd.concat(result_rows).drop('group_order', axis=1).reset_index(drop=True) print(final_result)
代码解释
groupby('ID').cumcount():给每个ID组内的行从0开始分配连续序号,完美保留对话的原始顺序,不管索引有多乱- 遍历df2时,先检查是否存在匹配的ID和Query,避免无意义的报错
- 最后合并结果并删除临时的
group_order列,得到你想要的干净输出
运行这段代码后,输出就会和你期望的完全一致:
ID Query Sent by 0 76649 yes tigers can be found there Support Team 1 76649 contact forest dept for more Support Team 2 76649 thanks for reaching out Support Team 3 67209 yes lions can be found there Support Team 4 67209 contact forest dept for more Support Team 5 67209 thanks for reaching out Support Team
内容的提问来源于stack exchange,提问作者kreate mk
相关产品推荐
相关产品推荐

