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
相关产品推荐
相关产品推荐

