基于前面行的Pandas dataframe if else条件

3

我有一个如下的Pandas数据框:

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来实现此操作,但我想更有效地快速完成此操作。

2个回答

1
您可以尝试使用 np.whereshift

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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接