You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多列排序后去重:保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:51:03