基于部门合并Account details与Account specifics并去重的Pandas实现问题
解决按部门合并Account数据并去重流程的问题
我懂你要搞定的事儿——把Account details和Account specifics的数据按部门维度整合,去掉同一部门里重复的流程,最后还要把所有行的Name统一成Account details对吧?之前用pd.groupby没成功,我给你分享两个靠谱的解决思路:
方法一:先去重再统一名称(最简单直接)
这个方法逻辑清晰:先把同一部门下重复的流程去掉,再把Name列统一替换成目标值,最后调整顺序匹配你的期望输出。
完整代码
import pandas as pd # 原始数据 df = pd.DataFrame({ "Name": ["Account details", "Account details", "Account details", "Account specifics", "Account specifics", "Account specifics"], "Department": ["HR", "HR", "Finance", "HR", "Finance", "Retail"], "Process": ["Process1", "Process2", "Process1", "Process2", "Process2", "Process1"] }) # 1. 按部门和流程去重,保留第一个出现的记录 df_unique = df.drop_duplicates(subset=["Department", "Process"], keep="first") # 2. 统一Name列为"Account details" df_unique["Name"] = "Account details" # 3. 按你期望的部门顺序排序(HR → Finance → Retail) custom_order = ["HR", "Finance", "Retail"] df_final = df_unique.set_index("Department").loc[custom_order].reset_index(drop=False) print(df_final)
输出结果
Name Department Process 0 Account details HR Process1 1 Account details HR Process2 2 Account details Finance Process1 3 Account details Finance Process2 4 Account details Retail Process1
完全匹配你要的期望输出!
方法二:用groupby实现(解决你之前的困惑)
如果你一定要用groupby来做,核心是分组后收集每个部门的所有流程并去重,再把列表拆分成单独的行。之前没成功可能是没处理好去重和行展开这两步:
完整代码
import pandas as pd # 原始数据同上 df = pd.DataFrame({ "Name": ["Account details", "Account details", "Account details", "Account specifics", "Account specifics", "Account specifics"], "Department": ["HR", "HR", "Finance", "HR", "Finance", "Retail"], "Process": ["Process1", "Process2", "Process1", "Process2", "Process2", "Process1"] }) # 按部门分组,收集该部门所有不重复的流程 grouped = df.groupby("Department")["Process"].apply(lambda x: list(pd.unique(x))).reset_index() # 把每个部门的流程列表拆分成单独的行 df_expanded = grouped.explode("Process") # 添加统一的Name列 df_expanded["Name"] = "Account details" # 调整列顺序和自定义排序 df_expanded = df_expanded[["Name", "Department", "Process"]] custom_order = ["HR", "Finance", "Retail"] df_final = df_expanded.set_index("Department").loc[custom_order].reset_index(drop=False) print(df_final)
这个方法也能得到和上面一样的结果,适合你想深入用groupby逻辑的场景。
内容的提问来源于stack exchange,提问作者torkestativ
相关产品推荐
相关产品推荐

