python pandas为值移动下一行

时间:2017-08-09 14:04:30

标签: python pandas shift

我用熊猫: 输入:

import pandas as pd
a=pd.Series([0,0,1,0,0,0,0])

输出:

0    0
1    0
2    1
3    0
4    0
5    0
6    0

我想以相同的值获取下一行的数据:

输出:

0    0
1    0
2    1
3    1
4    1
5    1
6    0

使用

a+a.shift(1)+a.shift(2)+a.shift(3)

我认为这不是一个聪明的解决方案 谁有一个聪明的解决方案

3 个答案:

答案 0 :(得分:0)

您可以尝试这一点,假设索引6也应该是值1

a=pd.Series([0,0,1,0,0,0,0])
a.eq(1).cumsum()

Out[19]: 
0    0
1    0
2    1
3    1
4    1
5    1
6    1
dtype: int32

更新:多个值不等于0。

a=pd.Series([0,0,1,0,1,3,0])
a.ne(0).cumsum()
A=pd.DataFrame({'a':a,'Id':a.ne(0).cumsum()})
A.groupby('Id').a.cumsum()


Out[58]: 
0    0
1    0
2    1
3    1
4    1
5    3
6    3

或者您可以使用ffill

a[a.eq(0)]=np.nan
a.ffill().fillna(0)

Out[64]: 
0    0.0
1    0.0
2    1.0
3    1.0
4    1.0
5    3.0
6    3.0

答案 1 :(得分:0)

1您可以过滤“您的”值(SearchValue)的系列。

2将数据重新索引为待定长度(LengthOfIndex)并向前填充“your”给定次数(LengthOfFillRange)

3再次用零填充。

 import pandas as pd
 import numpy as np
 a=pd.Series([0,0,1,0,0,0,0])
 SearchValue       = 1
 LengthOfIndex     = 7
 LengthOfFillRange = 4
 a=a[a==SearchValue]\
     .reindex(np.linspace(1,LengthOfIndex,LengthOfIndex, dtype='int32'),
              method='ffill',
              limit=LengthOfFillRange)\
     .fillna(0)

答案 2 :(得分:0)

如果您只需要重复2个值系列按某些限制使用replace用于NaN s,那么ffillfillna使用方法ffill)并持续fillna用于将NaN转换为原始值(如果需要,转换为int):

a=pd.Series([0,0,1,0,0,0,0,1,0,0,0,])
print (a)
0     0
1     0
2     1
3     0
4     0
5     0
6     0
7     1
8     0
9     0
10    0
dtype: int64

b= a.replace(0,np.nan).ffill(limit=2).fillna(0).astype(a.dtype)
print (b)
0     0
1     0
2     1
3     1
4     1
5     0
6     0
7     1
8     1
9     1
10    0
dtype: int64