使用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)
两种方法得到的结果都和你的期望一致:
| ID | Field1 | Field2 |
|---|---|---|
| 1 | A | '1' |
| 4 | B | '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
相关产品推荐
相关产品推荐

