如何按分组提取DataFrame中各组的首个非零值?
按分组提取每组首个非零values值及对应Days值
给定如下pandas DataFrame:
Group values Days A 0 12 A 0 15 A 30 18 A 60 20 B 0 2 B 15 10 B 16 20 B 20 30 C 0 5 C 30 10 C 70 15
需求是按Group分组,检索出每组的首个非零values值及其对应的Days值,期望输出如下:
Group Values Days A 30 18 B 15 10 C 30 10
解决方案
方法1:过滤非零后分组取首行
先筛选出values不为0的行,再按Group分组并取每组第一行,操作简洁高效:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C'], 'values': [0, 0, 30, 60, 0, 15, 16, 20, 0, 30, 70], 'Days': [12, 15, 18, 20, 2, 10, 20, 30, 5, 10, 15] }) # 过滤非零值 + 分组取首行 result = df[df['values'] != 0].groupby('Group').first().reset_index() # 重命名列以匹配期望输出 result = result.rename(columns={'values': 'Values'}) print(result)
方法2:groupby结合apply处理每组
如果需要针对每组单独筛选非零值并取首项,可使用apply,适合更复杂的组内逻辑:
result = df.groupby('Group').apply( lambda x: x[x['values'] != 0].iloc[0] ).reset_index(drop=True).rename(columns={'values': 'Values'}) print(result)
两种方法均能输出符合要求的结果。
内容的提问来源于stack exchange,提问作者BD'auria
相关产品推荐
相关产品推荐

