如何用Pandas Groupby获取每组中首个非零值的记录
问题
我创建了如下Pandas DataFrame:
import pandas as pd ds = {'cycle' : [1,1,1,1,2,2,2,2], 'values' : [0,0,-1,1,2,0,0,1]} df = pd.DataFrame(data=ds)
该DataFrame内容如下:
cycle values 0 1 0 1 1 0 2 1 -1 3 1 1 4 2 2 5 2 0 6 2 0 7 2 1
需要创建一个名为ds的新DataFrame,仅保留每个cycle分组中values列的首个非零值记录,期望结果如下:
cycle values 0 1 -1 1 2 2
解决方案
方法一:先过滤再分组取首行(推荐,效率更高)
先筛选出values不为0的行,再按cycle分组后取每组的第一行,最后重置索引:
# 筛选所有values非零的行 non_zero_rows = df[df['values'] != 0] # 按cycle分组,取每组第一行并重置索引 ds = non_zero_rows.groupby('cycle').first().reset_index()
方法二:分组内直接筛选首个非零行
通过groupby结合apply,在每个分组内找到第一个非零值对应的行:
ds = df.groupby('cycle').apply( lambda group: group[group['values'] != 0].iloc[0] ).reset_index(drop=True)
两种方法都能得到目标结果,方法一先过滤零值行,减少了分组处理的数据量,数据量大时效率更优;方法二逻辑更直接,适合快速实现需求。
内容的提问来源于stack exchange,提问作者Giampaolo Levorato
相关产品推荐
相关产品推荐

