You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas:基于分段列与标识列定位目标列的首尾值

问题描述

我有一个包含4列的数据集:

  • Column1:随机数值
  • Column2:0/1值
  • Column3:分段标识
  • Column4:标记当前值与前值是否不同

数据集示例:

Column1   Column2  Column3  Column4
  10         1       1        1
  10         1       1        0
  14         1       1        1
  14         1       1        0
  16         0       0        1
  17         1       2        1
  17         1       2        0
  19         1       2        1
  20         0       0        1
  24         0       0        1
  25         1       3        1
  25         1       3        0
  25         1       3        0
  29         1       3        1
  30         1       3        1
  30         1       3        0

需求:针对Column3的每个分段,提取Column4值为1时Column1的第一个值和最后一个值,期望输出:

Column3   Column45(first)  Column6 (last)
  1          10              14
  2          17              19
  3          25              30

我尝试了以下代码但未成功:

firstlast= (df.assign(fl=df['Column1'].abs()).groupby([['Column3' , 'Column4']]).size()['Column1'].agg([('min' , 'min'), ('max', 'max')]).add_prefix('Column1')) 

print (firstlast)

作为Python新手,希望获取可行的解决方案。


可行解决方案

步骤1:筛选符合条件的行

先只保留Column4等于1的行,我们只需要这些数据来提取首尾值:

filtered_df = df[df['Column4'] == 1]

步骤2:按Column3分组提取首尾值

对筛选后的数据集按Column3分组,直接提取每组Column1的第一个值和最后一个值:

result = filtered_df.groupby('Column3')['Column1'].agg(['first', 'last']).reset_index()

步骤3:重命名列名匹配期望输出

将列名调整为你需要的格式:

result.columns = ['Column3', 'Column45(first)', 'Column6 (last)']

步骤4:过滤不需要的分段(可选)

如果需要去掉Column3为0的分段(和你的期望输出一致),执行这一步:

result = result[result['Column3'].isin([1,2,3])]

完整代码

# 假设你的数据集已经存储为DataFrame df
filtered_df = df[df['Column4'] == 1]
result = filtered_df.groupby('Column3')['Column1'].agg(['first', 'last']).reset_index()
result.columns = ['Column3', 'Column45(first)', 'Column6 (last)']
result = result[result['Column3'].isin([1,2,3])]

print(result)

代码说明

  • 筛选Column4==1:直接剔除不需要的0值行,简化后续处理;
  • groupby('Column3')['Column1'].agg(['first', 'last']):按分段标识分组后,取每组Column1的首尾值,正好匹配需求;
  • reset_index():把分组用的Column3从索引变回普通列;
  • 最后过滤Column3=0的行,确保输出和预期一致。

最终输出

运行后会得到和期望完全一致的结果:

Column3  Column45(first)  Column6 (last)
0        1               10              14
1        2               17              19
2        3               25              30

内容的提问来源于stack exchange,提问作者April F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:22:45