我有一个如下所示的数据框(实际数据框很大,这里仅显示了一个片段)
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”的值,而对于其他组则没有。谁能让我知道我做错了什么?
如果我单独使用组值并使用公式,它将起作用! 下面是组Cycle = 7&Type = 2的图片,将其作为单独的df并在其中,第一行显示了“ SwitchCount”和“ Switch”的值!
更新以下图片是来自一位贡献者(jezrael)的建议后添加的,以为每个系列创建新的列以更好地进行调试。似乎如果前一组的最后一个值与新组的新值的相同符号(负值或正值)相同,则会发生此问题。 但是我的代码在groupby对象上,所以我认为它应该重新开始。我仍然无法解决这个问题。
答案 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