如何在Pandas DataFrame中实现多列按行比较并填充Position字段?
在Pandas DataFrame中实现点位Position字段填充的解决方案
我来给你一步步拆解怎么实现这个需求,核心思路就是把X-Coordinate、Y-Coordinate、ID_01完全相同的行归为一组,然后在每组内根据ID_02的大小来标记Position字段。
步骤1:构造示例DataFrame(如果你已经有现成的DataFrame可以跳过这步)
首先我们把你提供的示例数据转换成Pandas DataFrame:
import pandas as pd # 构造你给出的示例数据 data = { 'X-Coordinate': [45000, 45000, 94475, 94491, 94491, 94151, 94151, 95408, 95408, 94703, 94703, 93719, 93719, 95310, 95310, 99525, 99525, 101600, 102744, 101600, 102744, 104155, 104575], 'Y-Coordinate': [554000, 554000, 59530, 60948, 60948, 64480, 64480, 68694, 68694, 69961, 69961, 70786, 70786, 72044, 72044, 82049, 82049, 84306, 85032, 84306, 85032, 86535, 86430], 'ID_01': [15, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'ID_02': [35, 36, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11], 'Position': ['?', '?', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] } df = pd.DataFrame(data)
步骤2:核心逻辑实现
我们用groupby分组,再结合rank来标记每组内ID_02的大小顺序,最后根据顺序赋值Position:
# 按X、Y、ID_01分组,对每组的ID_02进行升序排名 df['id_rank'] = df.groupby(['X-Coordinate', 'Y-Coordinate', 'ID_01'])['ID_02'].rank(method='min', ascending=True) # 根据排名给Position赋值:排名1(ID_02最小)为End,排名2(ID_02最大)为Start,其余保持空值 df['Position'] = df.apply( lambda row: 'End' if row['id_rank'] == 1 else ('Start' if row['id_rank'] == 2 else ''), axis=1 ) # 删掉临时的排名列(可选) df = df.drop('id_rank', axis=1) # 查看处理后的结果 print(df)
逻辑说明
groupby(['X-Coordinate', 'Y-Coordinate', 'ID_01']):精准把需要对比的行归为一组,确保只有X、Y、ID_01完全一致的行才会被放在一起处理。rank(method='min', ascending=True):对每组内的ID_02从小到大排名,最小的ID_02会得到排名1,最大的(如果组内只有两行)会得到排名2。apply函数:根据排名结果给Position字段赋值,完全匹配你要求的规则——ID_02小的行标记End,大的标记Start;组内只有一行的保持空值。
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

