Python 熊猫:在多个条件下使用最后一列值?

Python 熊猫:在多个条件下使用最后一列值?,python,pandas,Python,Pandas,我试图找出如何使用Y的最后一列中的值和多个条件来推导Z和p 当Y在2到6之间=最后一列Z+5时, 当Y为1时,下一列Z=0+5, 当Y在2到6之间时,列Q=0, 当Y为1时,列Q=X乘以Z 原始DF: ╔════╦═══╗ ║ X ║ Y ║ ╠════╬═══╣ ║ 29 ║ 5 ║ ║ 28 ║ 4 ║ ║ 32 ║ 3 ║ ║ 29 ║ 3 ║ ║ 26 ║ 1 ║ ║ 38 ║ 5 ║ ║ 25 ║ 2 ║ ║ 33 ║ 3 ║ ║ 25 ║ 3 ║ ║ 25 ║ 5 ║ ║ 40 ║

我试图找出如何使用Y的最后一列中的值和多个条件来推导Z和p

当Y在2到6之间=最后一列Z+5时, 当Y为1时,下一列Z=0+5, 当Y在2到6之间时,列Q=0, 当Y为1时,列Q=X乘以Z 原始DF:

╔════╦═══╗ ║ X ║ Y ║ ╠════╬═══╣ ║ 29 ║ 5 ║ ║ 28 ║ 4 ║ ║ 32 ║ 3 ║ ║ 29 ║ 3 ║ ║ 26 ║ 1 ║ ║ 38 ║ 5 ║ ║ 25 ║ 2 ║ ║ 33 ║ 3 ║ ║ 25 ║ 3 ║ ║ 25 ║ 5 ║ ║ 40 ║ 1 ║ ║ 30 ║ 6 ║ ║ 31 ║ 3 ║ ║ 38 ║ 5 ║ ╚════╩═══╝ 非常感谢

使用由创建的带移位掩码的帮助程序系列,然后使用1和乘以5进行添加,并用于下一列使用:

使用由创建的带移位遮罩的“按辅助对象”系列,然后使用“1”和“5”进行相加,并用于下一列使用:

试试这个

s = df.Y.eq(1).shift(fill_value=True).cumsum()
df['Z'] = df.groupby(s).Y.cumcount().add(1) * 5
df['P'] = df.X.where(df.Y.eq(1), 0) * df.Z

In [756]: df
Out[756]:
     X  Y   Z     P
0   29  5   5     0
1   28  4  10     0
2   32  3  15     0
3   29  3  20     0
4   26  1  25   650
5   38  5   5     0
6   25  2  10     0
7   33  3  15     0
8   25  3  20     0
9   25  5  25     0
10  40  1  30  1200
11  30  6   5     0
12  31  3  10     0
13  38  5  15     0
试试这个

s = df.Y.eq(1).shift(fill_value=True).cumsum()
df['Z'] = df.groupby(s).Y.cumcount().add(1) * 5
df['P'] = df.X.where(df.Y.eq(1), 0) * df.Z

In [756]: df
Out[756]:
     X  Y   Z     P
0   29  5   5     0
1   28  4  10     0
2   32  3  15     0
3   29  3  20     0
4   26  1  25   650
5   38  5   5     0
6   25  2  10     0
7   33  3  15     0
8   25  3  20     0
9   25  5  25     0
10  40  1  30  1200
11  30  6   5     0
12  31  3  10     0
13  38  5  15     0

这取决于你需要的条件。但这个答案可能会帮助您:使用if时进行切换。Y中是否可能有1个连续值?如果是,会发生什么?是,Y中可能有1个连续值。当1是Y中的连续值时,它仍然是下一列Z=0+5。因此,每次Y为1时,下一列Z将重置并开始添加5,直到YIt中出现另一个1,具体取决于您需要的条件。但这个答案可能会帮助您:使用if时进行切换。Y中是否可能有1个连续值?如果是,会发生什么?是,Y中可能有1个连续值。当1是Y中的连续值时,它仍然是下一列Z=0+5。因此,每次Y为1时,下一列Z将重置并开始添加5,直到Y中出现另一列1
m = df['Y'].eq(1)
df['Z'] = df.groupby(m.shift().bfill().cumsum()).cumcount().add(1).mul(5)
df['P'] = np.where(m, df.X.mul(df.Z), 0)
print (df)
     X  Y   Z     P
0   29  5   5     0
1   28  4  10     0
2   32  3  15     0
3   29  3  20     0
4   26  1  25   650
5   38  5   5     0
6   25  2  10     0
7   33  3  15     0
8   25  3  20     0
9   25  5  25     0
10  40  1  30  1200
11  30  6   5     0
12  31  3  10     0
13  38  5  15     0
s = df.Y.eq(1).shift(fill_value=True).cumsum()
df['Z'] = df.groupby(s).Y.cumcount().add(1) * 5
df['P'] = df.X.where(df.Y.eq(1), 0) * df.Z

In [756]: df
Out[756]:
     X  Y   Z     P
0   29  5   5     0
1   28  4  10     0
2   32  3  15     0
3   29  3  20     0
4   26  1  25   650
5   38  5   5     0
6   25  2  10     0
7   33  3  15     0
8   25  3  20     0
9   25  5  25     0
10  40  1  30  1200
11  30  6   5     0
12  31  3  10     0
13  38  5  15     0