为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

临摹微笑 2022-09-13 17:38:07
我有以下要求来派生如下的新列#请建议。在我的实际数据集中,有超过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  S210  1   1   10  20  A   B10  1   2   11  25  C   C10  1   3   10  15  D   D10  1   4   9   10  C   C10  1   5   8   5   C   C10  2   1   20  40  B   A10  2   2   10  10  C   C10  2   3   15  30  C   C10  2   4   5   20  D   D10  2   5   25  10  C   CExpected Output DataFrame:P   T   W   A1  A2  S1  S2  D1% D2%10  1   1   10  20  A   B   0   010  1   2   11  25  C   C   10  2510  1   3   10  15  D   D   -9.090909091    -4010  1   4   9   10  C   C   -10 -33.3333333310  1   5   8   5   C   C   -11.11111111    -5010  2   1   20  40  B   A   0   010  2   2   10  10  C   C   -50 -7510  2   3   15  30  C   C   50  20010  2   4   5   20  D   D   -66.66666667    -33.3333333310  2   5   25  10  C   C   400 -50
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

据我所知,您可以堆叠2列S1和S2,并检查同一索引中的任何值是A还是B,然后使用np.where ,其中条件匹配,分配0 else分配pct_change与您在列A1和A2上显示的计算相同level=0

cond = 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.00

1  10  1  2  11  25  C  C   10.00   25.00

2  10  1  3  10  15  D  D   -9.09  -40.00

3  10  1  4   9  10  C  C  -10.00  -33.33

4  10  1  5   8   5  C  C  -11.11  -50.00

5  10  2  1  20  40  B  A    0.00    0.00

6  10  2  2  10  10  C  C  -50.00  -75.00

7  10  2  3  15  30  C  C   50.00  200.00

8  10  2  4   5  20  D  D  -66.67  -33.33

9  10  2  5  25  10  C  C  400.00  -50.00




查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信