数据框中有一个表:
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
答案 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