分组后总和计数无法正常工作

时间:2019-07-13 05:41:15

标签: pandas pandas-groupby

我有一个如下所示的数据框(实际数据框很大,这里仅显示了一个片段)

Cycle	Type	Time	Values
2	2	101	20.402
2	2	102	20.402
2	2	103	20.502
2	2	104	20.402
2	2	105	20.802
2	2	106	20.383
2	2	107	20.383
2	2	108	20.282
2	2	109	20.38
3	1	101	20.402
3	1	102	20.402
3	1	103	20.502
3	1	104	20.402
3	1	105	20.802
3	1	106	20.383
3	1	107	20.383
3	1	108	20.282
3	1	109	20.38
5	3	101	20.402
5	3	102	20.402
5	3	103	20.502
5	3	104	20.402
5	3	105	20.802
5	3	106	20.383
5	3	107	20.383
5	3	108	20.282
5	3	109	20.38

我想找到每个组中的连续负值和正值(我按“周期”和“类型”分组)以及对该值采取的步骤数。 因此,根据先前问题的答案(链接-> Value direction change in a pandas column), 我把下面的代码

`data_train['Detrended'] = data_train.groupby(['Cycle','Type']).Values.diff()

mtest_bel = data_train.groupby(['Cycle','Type'])['Values'].diff().ne(0)
posnegtest_bel =  (data_train.groupby(['Cycle','Type'])['Detrended']).apply(lambda x: x.where(mtest_bel).ffill().gt(0))
gtest_bel = posnegtest_bel.ne(posnegtest_bel.shift()).cumsum()
gtest_bel = gtest_bel.mask(data_train.groupby(['Cycle','Type'])['Detrended'].apply(lambda x: x.eq(0).groupby(gtest_bel).transform('all')).bfill())
data_train['SwitchCount'] = (np.where(~gtest_bel.duplicated(), 
                                          data_train.groupby(['Cycle','Type'])['Detrended']
                                          .apply(lambda x: x.groupby(gtest_bel).transform('count')), np.nan))
data_train['Switch'] = (np.where(~gtest_bel.duplicated(), data_train.groupby(['Cycle','Type'])['Detrended']
                                     .apply(lambda x: x.groupby(gtest_bel).transform('sum')), np.nan))

` 它似乎只适用于少数几个群体,但不适用于其他群体

如果工作正常,则每个组的第一行在“ SwitchCount”和“ Switch”列中应具有值。但是,正如您在图片中看到的那样,这没有发生。对于某些组,我们在第一行具有“ SwitchCount”和“ Switch”的值,而对于其他组则没有。谁能让我知道我做错了什么? enter image description here

如果我单独使用组值并使用公式,它将起作用! 下面是组Cycle = 7&Type = 2的图片,将其作为单独的df并在其中,第一行显示了“ SwitchCount”和“ Switch”的值! enter image description here

更新以下图片是来自一位贡献者(jezrael)的建议后添加的,以为每个系列创建新的列以更好地进行调试。似乎如果前一组的最后一个值与新组的新值的相同符号(负值或正值)相同,则会发生此问题。 但是我的代码在groupby对象上,所以我认为它应该重新开始。我仍然无法解决这个问题。 enter image description here

1 个答案:

答案 0 :(得分:1)

编辑:

在测试重复出现一些调试问题之后,每3列需要测试一次,而不仅是一列。

因此有必要进行更改:

~gtest_bel.duplicated()

收件人:

~data_train[['Cycle','Type']].assign(a=gtest_bel).duplicated()

在助手DataFrame的所有3列中进行测试。


我建议为每个Series创建一个新列,以进行更好的调试:

data_train['Detrended'] = data_train.groupby(['Cycle','Type']).Values.diff()
data_train['mtest_bel'] = data_train['Detrended'].ne(0)
data_train['posnegtest_bel'] =  (data_train.groupby(['Cycle','Type'])['Detrended']).apply(lambda x: x.where(data_train['mtest_bel']).ffill().gt(0))
data_train['gtest_bel'] = data_train['posnegtest_bel'].ne(data_train['posnegtest_bel'].shift()).cumsum()


data_train['gtest_bel1'] = data_train['gtest_bel'].mask(data_train.groupby(['Cycle','Type'])['Detrended'].apply(lambda x: x.eq(0).groupby(data_train['gtest_bel']).transform('all')).bfill())
data_train['SwitchCount'] = (np.where(~data_train['gtest_bel1'].duplicated(), 
                                     data_train.groupby(['Cycle','Type'])['Detrended']
                                              .apply(lambda x: x.groupby(data_train['gtest_bel1']).transform('count')), np.nan))
data_train['Switch'] = (np.where(~data_train['gtest_bel1'].duplicated(), data_train.groupby(['Cycle','Type'])['Detrended']
                                     .apply(lambda x: x.groupby(data_train['gtest_bel1']).transform('sum')), np.nan))

#only for better seen groups, after debug remove next row
data_train = data_train.set_index(['Cycle','Type'])
print (data_train)
            Time  Values  Detrended  mtest_bel  posnegtest_bel  gtest_bel  \
Cycle Type                                                                  
2     2      101  20.402        NaN       True           False          1   
      2      102  20.402      0.000      False           False          1   
      2      103  20.502      0.100       True            True          2   
      2      104  20.402     -0.100       True           False          3   
      2      105  20.802      0.400       True            True          4   
      2      106  20.383     -0.419       True           False          5   
      2      107  20.383      0.000      False           False          5   
      2      108  20.282     -0.101       True           False          5   
      2      109  20.380      0.098       True            True          6   
3     1      101  20.402        NaN       True           False          7   
      1      102  20.402      0.000      False           False          7   
      1      103  20.502      0.100       True            True          8   
      1      104  20.402     -0.100       True           False          9   
      1      105  20.802      0.400       True            True         10   
      1      106  20.383     -0.419       True           False         11   
      1      107  20.383      0.000      False           False         11   
      1      108  20.282     -0.101       True           False         11   
      1      109  20.380      0.098       True            True         12   
5     3      101  20.402        NaN       True           False         13   
      3      102  20.402      0.000      False           False         13   
      3      103  20.502      0.100       True            True         14   
      3      104  20.402     -0.100       True           False         15   
      3      105  20.802      0.400       True            True         16   
      3      106  20.383     -0.419       True           False         17   
      3      107  20.383      0.000      False           False         17   
      3      108  20.282     -0.101       True           False         17   
      3      109  20.380      0.098       True            True         18   

            gtest_bel1  SwitchCount  Switch  
Cycle Type                                   
2     2              1          1.0   0.000  
      2              1          NaN     NaN  
      2              2          1.0   0.100  
      2              3          1.0  -0.100  
      2              4          1.0   0.400  
      2              5          3.0  -0.520  
      2              5          NaN     NaN  
      2              5          NaN     NaN  
      2              6          1.0   0.098  
3     1              7          1.0   0.000  
      1              7          NaN     NaN  
      1              8          1.0   0.100  
      1              9          1.0  -0.100  
      1             10          1.0   0.400  
      1             11          3.0  -0.520  
      1             11          NaN     NaN  
      1             11          NaN     NaN  
      1             12          1.0   0.098  
5     3             13          1.0   0.000  
      3             13          NaN     NaN  
      3             14          1.0   0.100  
      3             15          1.0  -0.100  
      3             16          1.0   0.400  
      3             17          3.0  -0.520  
      3             17          NaN     NaN  
      3             17          NaN     NaN  
      3             18          1.0   0.098