如何依据另一DataFrame的UniqueID列排序并将无ID新条目置于末尾?
按已有DataFrame的UniqueID顺序排序新DataFrame并将无ID新条目置于底部
核心思路
通过给df1的UniqueID创建位置映射字典,为df2中的每条数据分配排序权重:存在于df1的ID按其在df1中的位置赋值,无ID的条目统一分配一个大于所有已有ID权重的值,确保排在末尾。这种方法不受NaN影响,完美解决索引排序失效的问题。
示例数据
先定义示例DataFrame:
import pandas as pd # 原始旧数据df1 df1 = pd.DataFrame({ 'UniqueID': [101, 102, 103, 104], 'ProjectName': ['项目A', '项目B', '项目C', '项目D'], 'DataOwner': ['张三', '李四', '王五', '赵六'] }) # 更新后的新数据df2(含无ID新条目、顺序混乱) df2 = pd.DataFrame({ 'UniqueID': [103, 101, None, 104, 102, None], 'ProjectName': ['项目C(更新)', '项目A(更新)', '新项目X', '项目D(更新)', '项目B(更新)', '新项目Y'], 'DataOwner': ['王五', '张三', '钱七', '赵六', '李四', '孙八'] })
解决方案代码
# 1. 构建UniqueID到df1中位置的映射字典 id_sort_map = {uid: pos for pos, uid in enumerate(df1['UniqueID'])} # 2. 给df2添加临时排序键:已有ID用映射的位置,无ID用df1的行数(确保排在最后) df2['_sort_key'] = df2['UniqueID'].map(id_sort_map).fillna(len(df1)) # 3. 按排序键排序,然后删除临时列 sorted_df = df2.sort_values(by='_sort_key').drop('_sort_key', axis=1) # 查看结果 print(sorted_df)
输出结果
UniqueID ProjectName DataOwner 1 101.0 项目A(更新) 张三 4 102.0 项目B(更新) 李四 0 103.0 项目C(更新) 王五 3 104.0 项目D(更新) 赵六 2 NaN 新项目X 钱七 5 NaN 新项目Y 孙八
关键说明
- 映射字典
id_sort_map直接关联df1中UniqueID的顺序,确保排序严格匹配原始数据的顺序。 fillna(len(df1))给无ID条目分配的权重比所有已有ID的位置值都大,因此会自动排在底部。- 若需要保留UniqueID的整数类型(避免NaN导致的浮点型),可在排序后转换类型:
sorted_df['UniqueID'] = sorted_df['UniqueID'].astype('Int64')
内容的提问来源于stack exchange,提问作者Eztaban
相关产品推荐
相关产品推荐

