多列排序后去重:保留DataFrame中translation列有效数据的问题
解决DataFrame去重时保留translation列有效数据的问题
方法一:分组筛选(直观可靠)
通过groupby对每组数据直接筛选,优先保留带有有效翻译的行;若组内无有效翻译,则保留任意一行(原行):
import pandas as pd def select_preferred_row(group): # 筛选出translation非空的行 valid_rows = group[pd.notna(group['translation'])] if not valid_rows.empty: # 返回组内第一条有效翻译行(可根据需求调整为last) return valid_rows.iloc[0] else: # 无有效翻译时返回组内第一条原行 return group.iloc[0] # 按指定列分组,应用筛选逻辑 result = df.groupby( ['message_timestamp', 'message', 'chat_id', 'other col'], as_index=False ).apply(select_preferred_row)
这种方法完全避开了translation列类型混合带来的排序问题,逻辑直接清晰,适合不需要保留原数据集排序的场景。
方法二:辅助列排序去重
通过添加标记列统一排序规则,确保有效翻译行在分组内处于drop_duplicates能保留的位置:
import pandas as pd # 添加辅助列:1表示有有效翻译,0表示无 df['has_translation'] = pd.notna(df['translation']).astype(int) # 排序:先按分组列,再按辅助列升序(让无翻译行在前,有翻译行在后) df_sorted = df.sort_values( by=['message_timestamp', 'message', 'chat_id', 'other col', 'has_translation'], na_position='first' ) # 去重时保留每组最后一行(即有翻译的行;无翻译则保留组内最后一行原数据) result = df_sorted.drop_duplicates( subset=['message_timestamp', 'message', 'chat_id', 'other col'], keep='last' ) # 移除辅助列 result = result.drop(columns=['has_translation'])
该方法能在保留原数据集部分排序逻辑的同时,确保有效翻译不丢失,适合需要维持原有数据顺序的场景。
内容的提问来源于stack exchange,提问作者athelas
相关产品推荐
相关产品推荐

