基于另一列中的2行计算列行

2024-03-29 06:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算一列中两行到新列之间的差值

(Y(A1)/X(A1))-(Y(A1)/X(A1))/(Y(A1)/X(A1))*100% (3/52-1/41)/(1/41)*100% = 57.72%

附加的代码正在工作,但最后一行由于某种原因被删除

c = c.rename(lambda x: (x)*2+1)
c = c.map('{:,.2f}%'.format)
df['Z']=c

预期结果:

    X   Y   Z
A1  41  1   
A2  52  3   57.72%
B1  74  6   
B2  74  4   -50.00%
C1  5   0   
C2  5   0   nan%
D1  120 7   
D2  131 7   -9.17%

我得到的是:

    X   Y   Z
A1  41  1   
A2  52  3   57.72%
B1  74  6   
B2  74  4   -50.00%
C1  5   0   
C2  5   0   nan%
D1  120 7   
D2  131 7

Tags: lambda代码formata2mapdfa1b2
1条回答
网友
1楼 · 发布于 2024-03-29 06:28:31

^{}创建的1d数组的整数除法创建的每2行,按组使用^{}

print (np.arange(len(df)) // 2)
[0 0 1 1 2 2 3 3]

df['Z1'] = df['X'].div(df['Y']).groupby(np.arange(len(df)) // 2).pct_change().mul(-100)
print (df)

      X  Y        Z         Z1
A1   41  1      NaN        NaN
A2   52  3   57.72%  57.723577
B1   74  6      NaN        NaN
B2   74  4  -50.00% -50.000000
C1    5  0      NaN        NaN
C2    5  0     nan%        NaN
D1  120  7      NaN        NaN
D2  131  7   -9.17%  -9.166667

另一种解决方案:

s1 = df['X'].div(df['Y'])
df['Z1'] = (1-s1[1::2] / s1[::2].values).mul(100)
print (df)

      X  Y        Z         Z1
A1   41  1      NaN        NaN
A2   52  3   57.72%  57.723577
B1   74  6      NaN        NaN
B2   74  4  -50.00% -50.000000
C1    5  0      NaN        NaN
C2    5  0     nan%        NaN
D1  120  7      NaN        NaN
D2  131  7   -9.17%  -9.166667

如果不匹配的值需要缺少值,请使用mapif-else避免将缺少的值转换为字符串:

s = df['X'].div(df['Y']).groupby(np.arange(len(df)) // 2).pct_change().mul(-100)
df['Z1'] = s.map(lambda x: '{:,.2f}%'.format(x) if x == x else np.nan)
print (df)

      X  Y        Z       Z1
A1   41  1      NaN      NaN
A2   52  3   57.72%   57.72%
B1   74  6      NaN      NaN
B2   74  4  -50.00%  -50.00%
C1    5  0      NaN      NaN
C2    5  0     nan%      NaN
D1  120  7      NaN      NaN
D2  131  7   -9.17%   -9.17%

相关问题 更多 >