Pandas按ip分组聚合type列时如何固定拼接顺序符合指定格式
Pandas分组按固定顺序拼接字段实现方案
问题说明
需要对如下结构的DataFrame按ip分组,将去重后的type值用斜杠拼接,且拼接顺序必须严格遵循Missing在前、Type 1居中、Type 2在后的规则,最终输出仅允许7种合法取值,不能出现Type 1/Missing、Type 2/Type 1这类顺序错误的结果。
输入数据
year ip type 2020 101 Missing 2021 101 Type 1 2022 101 Type 2 2020 102 Missing 2021 102 Missing 2020 103 Missing 2021 103 Type 2 2021 104 Type 1 2022 104 Type 2 2022 104 Type 2
预期输出
ip type 101 Missing/Type 1/Type 2 102 Missing 103 Missing/Type 2 104 Type 1/Type 2
原有实现直接对去重结果拼接,会保留数据原始出现顺序,无法保证固定排序规则,容易生成顺序错误的结果。
正确实现代码
核心逻辑是先给type字段绑定固定排序权重,分组内先按权重排序再去重拼接,从根源保证拼接顺序符合要求。
import pandas as pd # 定义type值的排序优先级,数值越小拼接时位置越靠前 type_order = { "Missing": 0, "Type 1": 1, "Type 2": 2 } # 给每条数据添加排序权重列 df["type_rank"] = df["type"].map(type_order) result = ( df # 先按ip分组、同ip下按type优先级排序 .sort_values(by=["ip", "type_rank"]) # 去除同ip下重复的type值 .drop_duplicates(subset=["ip", "type"]) # 按ip分组拼接type字段 .groupby("ip", as_index=False)["type"] .agg("/".join) )
效果说明
运行上述代码后得到的结果完全匹配预期,无论原始数据中同ip下的type值出现顺序如何混乱,最终拼接结果都会严格遵守指定顺序,输出只会是要求的7种合法值,不会出现顺序颠倒的异常情况。如果后续需要新增其他type取值,只需要在type_order字典中按想要的排序位置补充对应的权重值即可。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

