Pandas:在多个条件下使用最后一列值?

2024-03-29 13:07:40 发布

您现在位置: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 ║
╚════╩═══╝

所需产出:

╔════╦═══╦═════╦══════╗
║ X  ║ Y ║  Z  ║  P   ║
╠════╬═══╬═════╬══════╣
║ 29 ║ 5 ║  5  ║    0 ║
║ 28 ║ 4 ║ 10  ║    0 ║
║ 32 ║ 3 ║ 15  ║    0 ║
║ 29 ║ 3 ║ 20  ║    0 ║
║ 26 ║ 1 ║ 25  ║  650 ║
║ 38 ║ 5 ║  5  ║    0 ║
║ 25 ║ 2 ║ 10  ║    0 ║
║ 33 ║ 3 ║ 15  ║    0 ║
║ 25 ║ 3 ║ 20  ║    0 ║
║ 25 ║ 5 ║ 25  ║    0 ║
║ 40 ║ 1 ║ 30  ║ 1200 ║
║ 30 ║ 6 ║  5  ║    0 ║
║ 31 ║ 3 ║ 10  ║    0 ║
║ 38 ║ 5 ║ 15  ║    0 ║
╚════╩═══╩═════╩══════╝

我做了一些研究,发现使用了移位,但是,我不知道如何添加其他条件

data = {'X':[29,28,32,29,26,38,25,33,25,25,40,30,31,38], 'Y':[5,4,3,3,1,5,2,3,3,5,1,6,3,5]}

非常感谢


Tags: dfdata条件移位
2条回答

使用^{}by helper Series^{}创建的移位掩码,然后将^{}1相加,并将5^{}相加,对于下一列,使用^{}

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

相关问题 更多 >