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

使用Pandas按条件去重:按Field1分组保留Field2最大字符值行

使用Pandas保留每组Field1中Field2字符值最大的行

先看你的需求:针对每个唯一的Field1值,保留Field2字符值最大的行,优先级是 '3' > '2' > '1' > ' '。刚好这个优先级和字符串的自然降序排序规则一致(ASCII码中'3'(51) > '2'(50) > '1'(49) > ' '(32)),用Pandas可以轻松实现。

第一步:构造示例数据

先把你的原始数据转换成Pandas DataFrame:

import pandas as pd

# 模拟你的数据,Field2按你标注的字符型处理(如果实际数据不带单引号,去掉即可)
df = pd.DataFrame({
    'ID': [1, 2, 3, 4],
    'Field1': ['A', 'A', 'B', 'B'],
    'Field2': ["'1'", "' '", "'2'", "'3'"]
})

方法一:用groupby + idxmax快速定位目标行

idxmax()会返回每组中Field2值最大的行的索引,再用loc提取这些行即可:

# 按Field1分组,找到每组Field2最大的行的索引
max_row_indices = df.groupby('Field1')['Field2'].idxmax()
# 根据索引提取最终结果
result = df.loc[max_row_indices]

方法二:先排序再分组取首行

先按Field1升序、Field2降序排序,然后每组取第一行:

# 先排序:同Field1内按Field2降序排列
sorted_df = df.sort_values(by=['Field1', 'Field2'], ascending=[True, False])
# 每组保留第一行
result = sorted_df.groupby('Field1').head(1)

两种方法得到的结果都和你的期望一致:

IDField1Field2
1A'1'
4B'3'

如果你的字符优先级不是自然排序(比如自定义特殊字符顺序),可以先给Field2映射优先级分数来处理:

# 自定义优先级映射
priority_map = {"' '": 0, "'1'": 1, "'2'": 2, "'3'": 3}
df['priority_score'] = df['Field2'].map(priority_map)
# 按优先级分数取最大值对应的行
max_row_indices = df.groupby('Field1')['priority_score'].idxmax()
# 提取结果并删除临时列
result = df.loc[max_row_indices].drop('priority_score', axis=1)

内容的提问来源于stack exchange,提问作者babz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:10:10