熊猫列中的值方向变化

时间:2019-06-24 04:55:44

标签: pandas

我在下面的数据框中有一个列

Difference
0
0
0.067
0
0
0
0
0.062
0
0
0
0
0.018
0
0
0
0
-0.085
0
0
0
0
0.033
0
0
0
0
0.034
0
0
0
0
-0.083
0
0
0
0
-0.226
0
0
0
0
0.192
0
0
0
0
0.175
0
0
0
0
0.069
0
0
0
0
-0.066
0
0

值可以是一些连续的负数和一些连续的正数。 我想添加一列,该列具有连续正数和连续负数之和(结果示例中的column =“ Switch”),该列显示值的差异(结果示例中的column =“ Switch Value”)&最后,如果“ Switch”列中的两个值均为正,则另一列中为“ True”((在结果示例中为column =“ Same Switch”)。预期结果如下。

Difference	Switch	Switch Value	Same Switch
0			
0			
0.067			
0			
0			
0			
0			
0.062			
0			
0			
0			
0			
0.018			
0			
0			
0			
0			
-0.085	0.147		
0			
0			
0			
0			
0.033	-0.085	0.232	False
0			
0			
0			
0			
0.034			
0			
0			
0			
0			
-0.083	0.067	-0.152	False
0			
0			
0			
0			
-0.226			
0			
0			
0			
0			
0.192	-0.309	0.376	False
0			
0			
0			
0			
0.175			
0			
0			
0			
0			
0.069	0.436	-0.745	False
0			
0			
0			
0			
-0.066	0.003	0.433	True
0			
0			

1 个答案:

答案 0 :(得分:1)

使用:

m = df['Difference'].ne(0)
posneg =  df['Difference'].where(m).ffill().gt(0)
g = posneg.ne(posneg.shift()).cumsum()
g = g.mask(df['Difference'].eq(0).groupby(g).transform('all')).bfill()

df['Switch'] = np.where(~g.duplicated(), df['Difference'].groupby(g).transform('sum').shift(), np.nan)
df['Switch Value'] = np.where(~g.duplicated(), df['Switch'].ffill().shift().diff(-1), np.nan)
mask = df['Switch Value'].notna()
df['Same Switch'] = df.loc[mask, 'Switch'].eq(df.loc[mask, 'Switch Value'])

print (df.head(30))
    Difference  Switch  Switch Value Same Switch
0        0.000     NaN           NaN         NaN
1        0.000     NaN           NaN         NaN
2        0.067     NaN           NaN         NaN
3        0.000     NaN           NaN         NaN
4        0.000     NaN           NaN         NaN
5        0.000     NaN           NaN         NaN
6        0.000     NaN           NaN         NaN
7        0.062     NaN           NaN         NaN
8        0.000     NaN           NaN         NaN
9        0.000     NaN           NaN         NaN
10       0.000     NaN           NaN         NaN
11       0.000     NaN           NaN         NaN
12       0.018     NaN           NaN         NaN
13       0.000     NaN           NaN         NaN
14       0.000     NaN           NaN         NaN
15       0.000     NaN           NaN         NaN
16       0.000     NaN           NaN         NaN
17      -0.085   0.147           NaN         NaN
18       0.000     NaN           NaN         NaN
19       0.000     NaN           NaN         NaN
20       0.000     NaN           NaN         NaN
21       0.000     NaN           NaN         NaN
22       0.033  -0.085         0.232       False
23       0.000     NaN           NaN         NaN
24       0.000     NaN           NaN         NaN
25       0.000     NaN           NaN         NaN
26       0.000     NaN           NaN         NaN
27       0.034     NaN           NaN         NaN
28       0.000     NaN           NaN         NaN
29       0.000     NaN           NaN         NaN