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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:52:41