Python 熊猫:在多个条件下使用最后一列值?
我试图找出如何使用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”进行相加,并用于下一列使用: 试试这个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 ║
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