Pandas 数据帧 基于现有输入列派生新的计算列

我有以下要求来派生如下的新列#请建议。在我的实际数据集中,有超过1000万条记录,并且仅提供样本记录对于给定的P,T &W值,我们需要根据现有列(A1,A2,S1&S2)派生新列D1%&D2%。1)任何时间点,如果S1有值A或B,我们需要将值D1%硬编码为零 2)任何时间点,如果S2有值A或B,我们需要将值D2%硬编码为零 3)如果S1不等于A或B,我们需要计算D1%,如下所示: ((当前 A1 值 – 以前的 A1 值)/以前的 A1 值)* 100


如果 S2 不等于 A 或 B,我们需要计算 D2%,如下所示:((当前 A2 值 – 以前的 A2 值)/以前的 A2 值) * 100


示例 # 对于 P = 10,T = 1,W =1,D1% 为 “0”,因为 S1 的值为 “A”。对于 P = 10,T = 1,W =1,D2% 为 “0”,因为 S2 具有值 “B”。


               For P = 10, T = 1, W=2, A1=11 and S1 Is having value ‘C’.

                D1% = ((11-10)/10) * 100 = 10%


                For P = 10, T = 1, W=2, A2=25 and S2 Is having value ‘C’.

                D2% = ((25-20)/20) * 100 = 25%


Input DataFrame:

P   T   W   A1  A2  S1  S2

10  1   1   10  20  A   B

10  1   2   11  25  C   C

10  1   3   10  15  D   D

10  1   4   9   10  C   C

10  1   5   8   5   C   C

10  2   1   20  40  B   A

10  2   2   10  10  C   C

10  2   3   15  30  C   C

10  2   4   5   20  D   D

10  2   5   25  10  C   C



Expected Output DataFrame:


P   T   W   A1  A2  S1  S2  D1% D2%

10  1   1   10  20  A   B   0   0

10  1   2   11  25  C   C   10  25

10  1   3   10  15  D   D   -9.090909091    -40

10  1   4   9   10  C   C   -10 -33.33333333

10  1   5   8   5   C   C   -11.11111111    -50

10  2   1   20  40  B   A   0   0

10  2   2   10  10  C   C   -50 -75

10  2   3   15  30  C   C   50  200

10  2   4   5   20  D   D   -66.66666667    -33.33333333

10  2   5   25  10  C   C   400 -50


临摹微笑
浏览 81回答 1
1回答

慕的地8271018

据我所知,您可以堆叠2列S1和S2,并检查同一索引中的任何值是A还是B,然后使用np.where ,其中条件匹配,分配0 else分配pct_change与您在列A1和A2上显示的计算相同level=0cond = df[['S1','S2']].stack().isin(['A','B']).any(level=0)arr = np.where(cond[:,None], np.zeros(len(df))[:,None],                df[['A1','A2']].pct_change().mul(100).round(2))df[['D1%','D2%']] = pd.DataFrame(arr)print(df)    P  T  W  A1  A2 S1 S2     D1%     D2%0  10  1  1  10  20  A  B    0.00    0.001  10  1  2  11  25  C  C   10.00   25.002  10  1  3  10  15  D  D   -9.09  -40.003  10  1  4   9  10  C  C  -10.00  -33.334  10  1  5   8   5  C  C  -11.11  -50.005  10  2  1  20  40  B  A    0.00    0.006  10  2  2  10  10  C  C  -50.00  -75.007  10  2  3  15  30  C  C   50.00  200.008  10  2  4   5  20  D  D  -66.67  -33.339  10  2  5  25  10  C  C  400.00  -50.00
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python