首页 > 解决方案 > 在 groupby Pandas 中获得连胜

问题描述

我正在寻找一种计算组条纹的方法。对于每个组,如果之前的“结果”与当前的“结果”相同,则这两个结果将相加。如果先前的“结果”与当前的“结果”不同,或者如果没有先前的结果,那么它应该返回当前结果。

任何帮助表示赞赏

df_input = pd.DataFrame()
df_input['Name'] = ['A','B','A','A','C','C','B','A','B','C']
df_input['Result'] = [1,1,-1,-1,1,1,-1,1,-1,1]

df_output = pd.DataFrame()
df_output['Name'] = ['A','B','A','A','C','C','B','A','B','C']
df_output['Result'] = [1,1,-1,-1,1,1,-1,1,-1,1]
df_output['Streak'] = [1,1,-1,-2,1,2,-1,1,-2,3]
             

标签: pythonpandas

解决方案


首先创建一个组变量,为 each 中的每个连续相同值块分配一个组Name

g = df.Result.groupby(df.Name).transform(lambda x: x.diff().ne(0).cumsum())
g
0    1
1    1
2    2
3    2
4    1
5    1
6    2
7    3
8    2
9    1
Name: Result, dtype: int32

cumsum根据Name和 组变量计算:

df['Streak'] = df.Result.groupby([df.Name, g]).cumsum() 
df
  Name  Result  Streak
0    A       1       1
1    B       1       1
2    A      -1      -1
3    A      -1      -2
4    C       1       1
5    C       1       2
6    B      -1      -1
7    A       1       1
8    B      -1      -2
9    C       1       3

推荐阅读