首页 > 解决方案 > Pandas 按窗口范围分组(按类别跟进问题)

问题描述

跟进问题

我有以下数据表:我想在某个窗口和类别中提取组,例如 windows_size= 1000000

value          category    
65951649.0     A         
59397882.0     A       
7633231.0      A        
7638485.0      A       
65951649.0     B         
59397882.0     B       
7633231.0      B        
7638485.0      B   

Output:
value          category    group
65951649.0     A        1  
59397882.0     A        2
7633231.0      A        3 
7638485.0      A        3
65951649.0     B        1  
59397882.0     B        2
7633231.0      B        3 
7638485.0      B        3

是否可以在数据框中执行此操作,或者我必须在单独的数据框中为每个类别执行此操作?

标签: pythonpandasgroup-by

解决方案


使用自定义 lambda 函数:

window_size = 1000000
f = lambda x: x.diff().abs().gt(window_size).cumsum()
df["group"] = df.groupby('category')["value"].apply(f)+1
print (df)
        value category  group
0  65951649.0        A      1
1  59397882.0        A      2
2   7633231.0        A      3
3   7638485.0        A      3
4  65951649.0        B      1
5  59397882.0        B      2
6   7633231.0        B      3
7   7638485.0        B      3

或 double groupby,因为需要每组的差异和累积总和:

df["group"] = (df.groupby('category')["value"].diff().abs().gt(window_size)
                 .groupby(df['category']).cumsum()+1)

推荐阅读