与上一行比较和求和

时间:2019-05-26 06:03:27

标签: python-3.x pandas dataframe

数据框中有一个表:

X1  X2
1   1
1   2
1   3
2   2
2   2
1   2

每行都必须计算值Y,如果X1 = X1(上一行),则el = 0,其中Y = X2(上一行)+1。结果:

X1  X2  Y
1   1   0
1   2   2
1   3   3
2   2   0
2   2   3
1   2   0

3 个答案:

答案 0 :(得分:4)

您可以使用:

c1=df.X1.ne(df.X1.shift()) #checks for changes in X1 column

然后我们看到X1中没有任何变化的地方,取上一行并加1,否则为0。使用np.where()

df['Y']=np.where(~c1,df.X2.shift()+1,0).astype(int)
print(df)

   X1  X2  Y
0   1   1  0
1   1   2  2
2   1   3  3
3   2   2  0
4   2   2  3
5   1   2  0

答案 1 :(得分:3)

使用:

m = df['X1'].shift().eq(df['X1'])
print (m)
0    False
1     True
2     True
3    False
4     True
5    False
Name: X1, dtype: bool

详细信息

首先通过AppStore Review Guideline和由Series.shift进行比对来比较是否相等:

X2

然后移动列1,添加print (df['X2'].shift().add(1)) 0 NaN 1 2.0 2 3.0 3 4.0 4 3.0 5 3.0 Name: X2, dtype: float64

print (np.where(m, df['X2'].shift().add(1), 0))
[0. 2. 3. 0. 3. 0.]

并通过Series.eq设置新列:

df['Y'] = df.X1.shift().eq(df.X1)*(df.X2+1).shift().fillna(0).astype(int)
#pandas 0.24+
#df['Y'] = df.X1.shift().eq(df.X1)*(df.X2+1).shift(fill_value=0)
print (df)
   X1  X2  Y
0   1   1  0
1   1   2  2
2   1   3  3
3   2   2  0
4   2   2  3
5   1   2  0

@Divakar的另一种解决方案:

dasques = input('Do you want to try again? y/n ')
if dasques == ('n'): 
   running = False

答案 2 :(得分:1)

我在groupby不变的组上使用X1。在每个组上,对shift进行X2,向其加1。最后,fillna更改X1

的值
df['Y'] = df.groupby(df.X1.ne(df.X1.shift()).cumsum()).X2.shift().add(1).fillna(0)


Out[569]:
   X1  X2    Y
0   1   1  0.0
1   1   2  2.0
2   1   3  3.0
3   2   2  0.0
4   2   2  3.0
5   1   2  0.0