Python中对Pandas DataFrame按id分组,保留最早start_date和最晚end_date
按ID分组取最早起始日期和最晚结束日期的实现方案
输入数据
id start_date end_date 1 2023-01-01 2023-02-02 1 2023-02-05 2023-02-15 1 2023-02-16 2023-03-14
预期结果
id start_date end_date 1 2023-01-01 2023-03-14
1. SQL 通用实现
这是关系型数据库的标准解法,通过GROUP BY结合聚合函数直接完成需求:
SELECT id, MIN(start_date) AS start_date, MAX(end_date) AS end_date FROM your_table_name GROUP BY id;
核心逻辑:按id分组后,用MIN()提取每组最早的起始日期,MAX()提取每组最晚的结束日期,直接输出目标结果。
2. Python Pandas 实现
如果用Pandas处理内存中的数据集,可通过groupby配合agg方法实现:
import pandas as pd # 构造输入DataFrame data = { 'id': [1, 1, 1], 'start_date': ['2023-01-01', '2023-02-05', '2023-02-16'], 'end_date': ['2023-02-02', '2023-02-15', '2023-03-14'] } df = pd.DataFrame(data) # 转换为日期类型(确保聚合逻辑准确) df['start_date'] = pd.to_datetime(df['start_date']) df['end_date'] = pd.to_datetime(df['end_date']) # 分组聚合 result_df = df.groupby('id').agg( start_date=('start_date', 'min'), end_date=('end_date', 'max') ).reset_index() print(result_df)
执行后会输出符合预期的结果,reset_index()用于将分组的id还原为普通列。
3. Spark 大数据场景实现
针对大数据量的Spark环境,写法与SQL逻辑一致:
// Scala 示例 val df = spark.read.table("your_table_name") val resultDF = df.groupBy("id") .agg( min("start_date").alias("start_date"), max("end_date").alias("end_date") ) resultDF.show()
也可以直接执行Spark SQL语句:
SELECT id, MIN(start_date) AS start_date, MAX(end_date) AS end_date FROM your_table_name GROUP BY id;
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

