如何统计Pandas各分组下data_window连续递增1的次数
按分组统计data_window递增1的行数
给定如下DataFrame:
import pandas as pd df = pd.DataFrame({ 'sample_type': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'], 'data_window': [4, 5, 6, 1, 7, 8, 2, 3], 'value': [0.6, 0.1, 1.2, 0.5, 0.3, 0.8, 1.4, 0.7] })
需求:针对每个sample_type,统计data_window恰好递增1的行数(例如A对应2,B对应1,C对应1),能否用df['data_window'].diff()类方法按分组实现?
当然可以用diff()结合分组来完成,直接看实现方式:
方法1:分步清晰实现
# 计算每组内data_window的相邻行差值 df['window_diff'] = df.groupby('sample_type')['data_window'].diff() # 筛选出差值为1的行,再按样本类型统计数量 count_result = df[df['window_diff'] == 1].groupby('sample_type').size()
方法2:链式简洁写法
count_result = df.groupby('sample_type')['data_window'].apply(lambda x: (x.diff() == 1).sum())
运行后得到的结果完全符合预期:
sample_type A 2 B 1 C 1 dtype: int64
逻辑说明
groupby('sample_type'):限定只在同一样本类型内部计算差值,避免跨组干扰.diff():计算当前行与上一行的data_window差值,每组第一行因无前置行返回NaN(x.diff() == 1):将差值恰好为1的情况标记为True,其余为False.sum():对布尔序列求和(True等价于1,False等价于0),直接得到每组符合条件的行数
内容的提问来源于stack exchange,提问作者MAtennis9
相关产品推荐
相关产品推荐

