Python 3按姓名、编码筛选最新时间的唯一记录问题
嘿,作为Python新手碰到这种数据分组筛选的问题太正常啦!我给你准备了两种实用的解决方案,一种是纯Python基础实现,不用装额外库;另一种用pandas,处理起来更简洁高效~
解决方案1:纯Python基础实现(无需第三方库)
这个方法只用到Python标准库,适合数据量不大的场景,思路是用字典来跟踪每组(姓名+编码)的最新记录:
- 遍历所有记录,把时间字符串转换成
datetime对象(方便比较时间先后) - 用
(姓名, 编码)作为字典的键,存储该组当前最新的记录 - 每遇到一条记录,就和字典中对应组的记录比较时间,更新为最新的那条
from datetime import datetime # 你的输入数据 data = [ ('Rodriguez, Cesar', '000500', '2018-05-15 8:09:12'), ('Rodriguez, Cesar', '000500', '2018-05-15 12:09:12'), ('Rodriguez, Cesar', '000500', '2018-05-15 12:09:12'), ('Gura, Simon', '000501', '2018-05-15 09:09:12') ] latest_records = {} for name, code, dt_str in data: # 转换时间字符串为datetime对象,方便比较 current_dt = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S') group_key = (name, code) # 如果是该组第一条记录,或者当前记录时间更新,就替换 if group_key not in latest_records: latest_records[group_key] = (name, code, dt_str) else: existing_dt = datetime.strptime(latest_records[group_key][2], '%Y-%m-%d %H:%M:%S') if current_dt > existing_dt: latest_records[group_key] = (name, code, dt_str) # 输出结果,转成列表格式 result = list(latest_records.values()) for item in result: print(item)
运行后就能得到你想要的结果:
('Rodriguez, Cesar', '000500', '2018-05-15 12:09:12')
('Gura, Simon', '000501', '2018-05-15 09:09:12')
解决方案2:用Pandas快速处理(适合大数据量)
如果你的数据量比较大,或者后续还有更多数据处理需求,用pandas库会更高效简洁,几行代码就能搞定:
import pandas as pd # 你的输入数据 data = [ ('Rodriguez, Cesar', '000500', '2018-05-15 8:09:12'), ('Rodriguez, Cesar', '000500', '2018-05-15 12:09:12'), ('Rodriguez, Cesar', '000500', '2018-05-15 12:09:12'), ('Gura, Simon', '000501', '2018-05-15 09:09:12') ] # 转换为DataFrame格式 df = pd.DataFrame(data, columns=['Name', 'Code', 'Datetime']) # 将时间列转为datetime类型 df['Datetime'] = pd.to_datetime(df['Datetime']) # 按姓名和编码分组,取每组时间最新的记录 latest_df = df.groupby(['Name', 'Code'], as_index=False).max() # 转换为元组列表并输出 result = [tuple(row) for row in latest_df.values] for item in result: print(item)
这个方法的优势在于pandas内部做了优化,处理大量数据时比纯循环快很多,而且代码可读性更强。
内容的提问来源于stack exchange,提问作者Cesar Rodriguez
相关产品推荐
相关产品推荐

