我有一个熊猫数据框,如下所示:
df = pd.DataFrame({'X':[1,1,1, 0, 0]})
df
X
0 1
1 1
2 1
3 0
4 0
现在我要创建另一个变量'Y',并且Y的值应基于以下条件:
If X = 1 , Y=1
If X = 0 and previous X = 1, Y = 2
If X = 0 and previous x = 0, Y = 0
因此,我的最终输出应如下所示:
X Y
0 1 1
1 1 1
2 1 1
3 0 2
4 0 0
这可以通过遍历行并设置当前行和上一行并使用iloc来实现,但是我想要一种更高效的方法来更快地完成此操作
答案 0 :(得分:1)
您可以尝试使用np.where
和shift
:
import pandas as pd
import numpy as np
df = pd.DataFrame({'X':[1,1,1, 0, 0]})
df['Y'] = np.where(df['X'] == 1,1,np.where(df['X'].shift(periods=1) == 1,2,0))
print(df)
输出:
X Y
0 1 1
1 1 1
2 1 1
3 0 2
4 0 0
答案 1 :(得分:0)
Celius提供了对np.where
的嵌套调用的答案。如果条件数量增加,这可能变得不可行。您可以改用np.select
获得相同的结果:
import numpy as np
import pandas as pd
df = pd.DataFrame({
'X': [1, 1, 1, 0, 0]
})
conditions = [
df["X"] == 1,
(df["X"] == 0) & (df["X"].shift() == 1),
(df["X"] == 0) & (df["X"].shift() == 0)
]
values = [1, 2, 0]
df['Y'] = np.select(conditions, values, default=np.nan)