如何使用Python Pandas保留每个姓氏的最后Level2地点并转换表格?
用Pandas实现按姓氏保留最后一条Level2记录
实现步骤
假设你的数据存储在Pandas DataFrame df 中,包含姓氏(列名示例:Surname)、级别(列名示例:Level,值为Level1/Level2)及其他业务列,按以下步骤处理:
提取所有Level1记录
直接筛选保留所有Level1的行:level1_rows = df[df['Level'] == 'Level1']提取每个姓氏的最后一条Level2记录
先筛选出所有Level2行,再按姓氏分组取每组最后一行:level2_last_rows = df[df['Level'] == 'Level2'].groupby('Surname').last().reset_index()groupby('Surname'):按姓氏维度分组.last():提取每组的最后一行数据.reset_index():重置索引为普通列,避免合并时出现索引冲突
合并结果并整理顺序
合并Level1全量行和Level2的最终行,再按姓氏排序保持分组逻辑:import pandas as pd result_df = pd.concat([level1_rows, level2_last_rows]).sort_values('Surname').reset_index(drop=True)
补充:保留原表行顺序的方案
如果需要严格遵循原表中记录的出现顺序(而非按姓氏排序),可以先给原表添加行号标记,再通过行号取每组Level2的最后一条:
df['row_num'] = range(len(df)) level1_rows = df[df['Level'] == 'Level1'] # 按姓氏分组,取每组行号最大的那一行(即原表中最后出现的Level2记录) level2_last_rows = df[df['Level'] == 'Level2'].groupby('Surname').apply(lambda x: x.loc[x['row_num'].idxmax()]).reset_index(drop=True) # 合并后按原行号排序,再删除行号列 result_df = pd.concat([level1_rows, level2_last_rows]).sort_values('row_num').drop('row_num', axis=1).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Vish
相关产品推荐
相关产品推荐

