Python Pandas使用sort_values与drop_duplicates去重丢失doggo数据问题
问题原因
你之前的代码存在两个问题:
- 直接对
stage字段按字符串降序排序不符合业务优先级:字符串字典序中d开头的doggo排序优先级低于p开头的其他stage值,降序排序时doggo会排在同一tweet_id其他stage值的后面,keep='first'配置会直接丢弃排在后面的doggo行。 - 如果你的去重规则是仅当
tweet_id和stage同时重复时才删除,那么drop_duplicates的subset参数需要同时传入这两个字段,仅传tweet_id会把同一tweet_id下所有非最高优先级的stage行全部删除。
解决方案
场景1:需求为「同一tweet_id仅保留优先级最高的1个stage行」
首先给stage字段自定义排序优先级,把需要优先保留的doggo设为最高级:
import pandas as pd # 按优先级从高到低定义stage顺序,可根据实际业务调整排列顺序 stage_priority = ['doggo', 'floofer', 'pupper', 'puppo'] twitter_archive['stage'] = pd.Categorical(twitter_archive['stage'], categories=stage_priority, ordered=True) # 按stage优先级升序排序(优先级高的排在前面),去重时保留第一个 twitter_archive = twitter_archive.sort_values(by='stage', ascending=True)\ .drop_duplicates(subset='tweet_id', keep='first')\ .sort_index()\ .reset_index(drop=True)
场景2:需求为「仅删除tweet_id和stage完全相同的重复行,同一tweet_id不同stage的行全部保留」
直接调整去重判断字段即可:
twitter_archive = twitter_archive.drop_duplicates(subset=['tweet_id', 'stage'], keep='first')\ .sort_index()\ .reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Asma
相关产品推荐
相关产品推荐

